ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 참가자 등록 구현, DTO
    Backend/개발 2021. 8. 2. 02:02
    반응형

    TIL 32일차 : 개인프로젝트 기록 

    Entity 등록 쿼리

    저번에 entity가 save되는 기록을 확인해봤다.

    Hibernate: create table participants (id bigint not null auto_increment, created_date datetime, modified_date datetime, comment varchar(255), current_tier varchar(255) not null, highest_tier varchar(255) not null, main_position varchar(255) not null, point bigint, sub_positions varchar(255), summoner_name varchar(255) not null, primary key (id)) engine=InnoDB

     

    실행했을 때 Table이 생성되는 로그이다.


    티어는 글자수가 아무리 해봐야 15자가 안되는 것 같아서 길이를 15로 줄였다. (gold1,platinum4,challenger,grandmaster등)

        @Column(length = 15, nullable = false)
        private String currentTier;
    
        @Column(length = 15, nullable = false)
        private String highestTier;

     

    스프링 Bean 주입방식

    출처 : https://jojoldu.tistory.com/251

    • @Autowired
    • setter
    • 생성자 : 가장 권장되는 방식
        private ParticipantsRepository participantsRepository;
    
        pulic IndexController(ParticipantsRepository participantsRepository){
            this.participantsRepository = participantsRepository;
        }

    이런 방식으로 생성자로 입력하는걸 lombok의 @AllArgsControctur가 생성해준다. 의존성 관계가 변경될 때 마다 계속해서 생성자 코드를 수정하지 않아도 된다.

    h2 연결

    참고 https://bcp0109.tistory.com/315
    url은 jdbc:h2:mem:testdb

    @Service
    @AllArgsConstructor
    public class ParticipantsService {
        private ParticipantsRepository participantsRepository;
    
        @Transactional
        public Long save(@RequestBody ParticipantsSaveRequestDto dto) {
            return participantsRepository.save(dto.toEntity()).getId();
        }
    }

    Service메소드는 @Transactional을 필수적으로 가져간다.
    이 어노테이션은 메소드 내에서 Exception이 발생하면 해당 메소드에서 이루어진 모든 DB 작업을 초기화시킨다.


    지금까지 구현한 내용



    32_4

    등록하기 누르면 쿼리가 실행되었다.

     

    32_3


    h2-console을 통해 확인했는데 subposition에 들어가지 않았다.



    private String subPositions;

    찾아보니 부 포지션은 여러개일 수 있어서 html,js코드에 s를 붙였는데 안붙여서 들어가지 않았다. .. !

    32_5

    다시 잘 들어가는 것을 확인 했다 ㅎㅎ 이거로라도 티어 올려보기 .


    Entity 를 DTO로 보호하는 이유

    이부분을 잘 짚고 넘어가야 할 것 같아서 여러 블로그들을 보면서 정리를 해봐야겠다.

    출처

    https://woowacourse.github.io/tecoble/post/2020-08-31-dto-vs-entity/

    https://parkadd.tistory.com/53

    1. 엔티티 내부 구현 캡슐화
      • 엔티티는 실제 DB테이블과 매칭되는 클래스이며 getter, setter를 가지게되면 의도치 않게 자원이 변경될 수 있다.
      • 엔티티를 UI에 노출하는 것은 보안상으로 바람직 하지 않다.
    2. 화면에 필요한 데이터 선별
      • JsonIgnore로 선별하는 것 만으로는 해결이 되지 않는다.
    3. 순환참조 예방
      • JPA로 개발할 때 양방향 참조를 사용했다면 양방향 참조된 엔티티를 컨트롤러에서 return했을 때 무한루프에 빠지게 된다. 이때 return으로 DTO를 두는 것이 안전할 수도 있다.
    4. validation 코드와 모델링 코드의 분리
      • join컬럼과 같은 모델링 코드는 Entity에, @Notnull @NotEmpty @NotBlak 등 요청에 대한 validation코드는 DTO에 정의하면 Entity 클래스를 좀 더 모델링과 비즈니스 로직에집중시킬 수 있다.

    DTO는 데이터 접근 메서드 외에 기능을 가지지 않습니다. (getter, setter외에 비즈니스 로직을 가지지 않는다.)

    DTO에 toEntity를 작성했는데 ModelMapper 를 이용하면 DTO<->Entity 를 해주는 것 같다.. 좀 더 알아봐야될듯 ~

    https://www.amitph.com/spring-entity-to-dto/

    https://dbbymoon.tistory.com/4 -- > dto<->entity 하고 modelmapper로 바꾸고 그때 생기는 문제에 대해 잘 정리해주셨다.

    https://velog.io/@aidenshin/DTO%EC%97%90-%EA%B4%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

    이 두개 읽어보고 꼭 머리속에 담자!!

     

    <추가>

    Client <-> Controller <-> Service  : DTO

    Service <-> Repository <-> DB : Entity 

     

    Entity<->Dto 변환을 직접 toEntity 메서드를 만들어서 할 수도 있고, ModelMapper라는걸 사용해도 되는데, 

    ModelMapper는 런타임 시점에야 오류를 잡을 수 있어서 reflection에 대한 이해도 있어야 한다. (고 한ㄷ ㅏ.. )
    일단은 개념을 좀 확실히 잡고, 번거로운걸 대체하는게 먼저는 아니니까 그냥 수동으로 변환을 해줘야 겠다.

    그리고 Entity->Dto는 뭐 toDto 함수를 만들어야되나?하고 생각해봤는데, Dto의 생성자를 만들 때 Entity로 받아서 만들어줘도 되고.. 생성자로 값 전달해주는 과정이 거의 toDto인것 같다 .. 


    다음에 할 일

    h2 와 JPA

    지금 h2로 일회성으로 했는데, 참가자를 등록하는 것 보다 일단 등록되어있다는걸 전제로 경매프로그램을 만드는게 우선인 것 같아서

    JPA를 써서 로컬DB에 저장을 해둬야겠다.

    그다음 얼른 일단 경매프로그램 모양을 좀 짜는것으로 ..!!



    댓글

Designed by Tistory.