-
[Spring Boot] 참가자 등록 구현, DTOBackend/개발 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 작업을 초기화시킨다.
지금까지 구현한 내용
등록하기 누르면 쿼리가 실행되었다.
h2-console을 통해 확인했는데 subposition에 들어가지 않았다.private String subPositions;
찾아보니 부 포지션은 여러개일 수 있어서 html,js코드에 s를 붙였는데 안붙여서 들어가지 않았다. .. !
다시 잘 들어가는 것을 확인 했다 ㅎㅎ 이거로라도 티어 올려보기 .
Entity 를 DTO로 보호하는 이유
이부분을 잘 짚고 넘어가야 할 것 같아서 여러 블로그들을 보면서 정리를 해봐야겠다.
출처
https://woowacourse.github.io/tecoble/post/2020-08-31-dto-vs-entity/
- 엔티티 내부 구현 캡슐화
- 엔티티는 실제 DB테이블과 매칭되는 클래스이며 getter, setter를 가지게되면 의도치 않게 자원이 변경될 수 있다.
- 엔티티를 UI에 노출하는 것은 보안상으로 바람직 하지 않다.
- 화면에 필요한 데이터 선별
- JsonIgnore로 선별하는 것 만으로는 해결이 되지 않는다.
- 순환참조 예방
- JPA로 개발할 때 양방향 참조를 사용했다면 양방향 참조된 엔티티를 컨트롤러에서 return했을 때 무한루프에 빠지게 된다. 이때 return으로 DTO를 두는 것이 안전할 수도 있다.
- validation 코드와 모델링 코드의 분리
- join컬럼과 같은 모델링 코드는 Entity에,
@Notnull
@NotEmpty
@NotBlak
등 요청에 대한 validation코드는 DTO에 정의하면 Entity 클래스를 좀 더 모델링과 비즈니스 로직에집중시킬 수 있다.
- join컬럼과 같은 모델링 코드는 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에 저장을 해둬야겠다.
그다음 얼른 일단 경매프로그램 모양을 좀 짜는것으로 ..!!
'Backend > 개발' 카테고리의 다른 글
[Spring Boot] JPA (4) 2021.08.03 [Spring Boot] 프로젝트 gradle 버전 변경 , h2 (2) 2021.08.03 [Spring Boot] 경매 프로그램 , 엔티티 설계 (3) 2021.07.28 [Spring Boot] spread sheet 연동하기 2 (0) 2021.07.23 [Spring Boot] spread sheet 연동하기 (3) 2021.07.21