현재 백엔드 세미나에서는 쇼핑몰 만들기 프로젝트로 공부를 한다.
2주차 과제는 Service와 Entity, 각 상황에 맞는 DTO를 만들어서 Controller와 연결하기였다.
이 과제를 하면서 알게된것을 정리해보자면
1. Entity에서 원시타입과 래퍼클래스를 사용하는 기준
2. Builder 패턴과 Lombok의 @Builder
3. @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor에 관해서 더 자세히
4. @AllArgsConstructor와 @RequiredArgsConstructor의 문제점
5. 그럼에도 불구하고 내가 RequiredArgsConstructor 어노테이션을 사용하는 이유
6. @NoArgsConstructor에 (accsee = AccseeLevel.PROTECTED)를 붙이는 이유
7. JPA에서 엔티티는 반드시 기본생성자를 가져야한다.
정도가 있다.
처음부터 차근차근 보면
▶ 1. Entity에서 원시타입과 래퍼클래스를 사용하는 기준
https://learning-study.tistory.com/entry/Spring-Boot-Entity%EC%97%90%EC%84%9C-%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85%EA%B3%BC-%EB%9E%98%ED%8D%BC%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B8%B0%EC%A4%80
위 글에 작성해놓았다!
▶ 2. Builder 패턴과 Lombok의 @Builder
https://learning-study.tistory.com/entry/Spring-Boot-Builder-%ED%8C%A8%ED%84%B4%EA%B3%BC-Lombok%EC%9D%98-Builder
이 글에 정리를 해두었다!
과제를 하기전에 Builder패턴이 모지?? 했었는데
이번 과제를 통해서 Builder패턴이 왜 탄생했고 왜 사용하는지 알게되었다.
역시 코드는 공부하고 알고 짜는게 재밌다...
▶3,4,5
https://learning-study.tistory.com/entry/Spring-Boot-AllArgsConstructor%EA%B3%BC-RequiredArgsConstructor-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90%EA%B4%80%ED%95%9C-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
여기에 생성자 어노테이션을 정리해두었다.
사실 이번 과제하기 전에는 그냥 뭔지도 잘 모르고 사용했던 어노테이션이었는데
이번 과제를 통해서 정확하게 알게되었고
@AllArgsConstructor, @RequiredArgsConstructor 사용을 지양해야하는 이유와
그럼에도 내가 @AllArgsConstructor는 "지양"하지만 @RequiredArgsConstructor을 사용하는 이유에 대해서 적어놓았다.
그 이유는
- 사용자가 final 키워드를 붙이면서 필수 파라미터에 대한 인지를 하고 필드를 선언한다는 점
- 스프링에서는 객체의 생성자만 만들어두면 스프링에서 알맞은 타입과 이름의 빈을 찾아서 주입해주기 때문에, 필드 순서가 바뀌거나 해도 타입+이름 기반으로 동작하니 @RequiredArgsConstructor 를 사용해도 큰 무리가 없음
이다.
또한
https://learning-study.tistory.com/entry/Spring-Boot-%EB%82%B4%EA%B0%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%A0%EC%96%B8%EB%B6%80%EC%97%90-Builder%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0
이 글에서는 @AllArgsConstructor을 사용하지 않고 @Builder를 사용하는 방법에대해서 적어놓았다!
(클래스단이 아닌 생성자에 @Builder를 붙이면 된다.)
확실히 이건 왜 쓰면 안되고 이걸 안쓰면 이렇게해주면 되는구나!
를 이해하고 코드를 짜니까 더 재밌었다. delombok이라는 기능에 대해서도 알게되었다.
▶ 6, 7. @NoArgsConstructor에 (access = AccseeLevel.PROTECTED)를 붙이는 이유, JPA에서 엔티티는 반드시 기본생성자를 가져야한다.
https://learning-study.tistory.com/entry/Spring-Boot-JPA-Entity%EC%97%90%EC%84%9C-%EA%B8%B0%EB%B3%B8-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9D%B4%EC%9C%A0-Reflection%EC%9D%B4%EB%9E%80-proxy-%EA%B0%9D%EC%B2%B4%EB%9E%80-NoArgsConstructoraccess-AccessLevelPROTECTED%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
위 글에 자세하게 작성해놓았다!
아니.. 이런 의미가..있었다니...
아직 모르는게 너무 많은 것 같다.
추가로 JPA에 대해서 더 깊게 공부해보고 싶다..!