- Join 기능을 사용하지 않았기 때문에 분명히 성능적으로 좋아지는 것을 체감할 수 있었다.
- 어떤 로직을 코드로 짤 때마다 연관된 것을 직접 매핑해줘야 했기에 확실히 신경 쓸 부분이 많았다.
- 조회시 성능이 정말 중요한 로직에는 적용하면 좋을 것 같다는 생각을 했다.
- 패캠 레포에 커밋을 하며 올렸고 개인 레포에는 통으로 올렸다.
- 무엇인가를 수정할 때
fix
를 남발했는데 fix는 심각한 오류, 버그를 수정했을 경우 사용한다고 한다.
@Autowired
를 사용하지 않고 테스트 코드에서만 사용하였다. 그리고 모두 생성자 주입을 이용했다.
- 순환 참조를 막고, 객체 불변성을 높일 수 있다는 장점이 있다.
- 테스트 코드에서는
@Autowired MockMvc mockMvc
으로 사용했기 때문에 괜찮을 것이라고 생각했다.
- 프로젝트 다른 것들에 신경 쓰다가 DTO를 신경 쓰지 못해 코드 리뷰를 받고 DTO를 추가했다.
- 나중에 추가하는 것보다 처음부터 잘 설계하는 게 훨씬 시간 단축에 좋다.(내 생각)
- 팀프로젝트에서 팀원들과 정해야 할 문제
@Table
의 유니크 제약 조건에 대해 학습하기
- 클래스에
@Table(name="테이블이름", uniqueConstrains={@UniqueConstraint(name="제약조건이름", colummnNames={"컬럼명1","컬럼명2"})})
- 필드에
@Column(name="컬럼명1")
@Transactional
이 적용되지 않는다.
- Spring AOP는 기본적으로 JDK 프록시 기법으로 움직인다. 이 기법이 적용되려면 인터페이스가 존재해야 하는데 Controller는 일반적으로 인터페이스를 구현하지 않는다. (Service 인터페이스를 만들어서 사용했던 것이 이 이유 때문이었다.)
- JDK 프록시는 리플렉션을 이용하며 Target의 상위 인터페이스를 상속받아 프록시를 만든다.
- 리플렉션은 클래스 타입을 알지 못해도 클래스에 접근할 수 있게 해주는 API이다.
- 비용이 높아 사용을 지양해야 한다.
- Spring Boot AOP 는 기본적으로 CGLib을 적용하여
@Transactional
를 적용한다.
- CGLib(Code Generator Library) : 클래스 기반 바이트 코드 조작하고 Target 클래스를 상속 받아 프록시를 만든다, private 적용하면 사용할 수 없다.
@BeforeEach
를 이용하여 테스트 코드를 작성해보는 것이 좋다. 각 단위 테스트의 독립성을 높이는 효과가 있다.
- 전에는 그냥 테스트 메소드 밖에 객체를 생성하고 돌려 쓰는 방식이었는데 테스트 간에 연관성을 가지고 올 수 있겠구나 생각했다.
@DisplayName
에 given/when/then 을 이용한 이름으로 적어보면 가독성이 좋아진다.@Autowired MockMvc mockMvc
말고 MockMvcRequestBuilder를 이용해보기
- 약간 우리가 사용하는 전자제품 사용은 너무 간편하지만 그 속의 정말 어려운 로직과 원리들을 파고드는 느낌이랄까?
Reference: