스프링

<인프런> 실전! 스프링 부트와 JPA 활용1 - 새로이 배운 것

석우진 2024. 7. 18. 21:27

1. 마구잡이식 개발에서 벗어나자 

기능 요구사항 분석 -> ERD 설계 -> ERD에 맞춰 Entity 설계 -> Repository, Service 구현 -> 구현 사항 테스트 -> 프론트엔드 연결

 

2. 영속성 컨텍스트 내부 객체는 한 트랜잭션이 커밋될 때, 더티 체킹을 통해 알아서 DB에 수정사항이 반영된다.

(장고 orm에서는 가져온 객체를 수정하더라도 post.save()와 같이 반영을 해줘야 했는 데, JPA에는 Dirty Checking 기능이 있어서 그렇다!, 꽤나 똑똑한듯) 

+) 자체적으로 merge 하는 방법보다 이 JPA의 변경감지 기능을 사용하는 설계가 옳다. 처음부터 준영속 객체를 생성하지 말고, 영속 객체를 DB에서 꺼내오는 식으로

 

3. 엔티티 클래스에서 자체적으로 비지니스 로직을 이용할 수 있다.

setMember나 setDelivery 같은 내부 함수로 객체를 관리 하는 코드.. 이런 생각을 못해봤는 데, 객체지향 관점에서 더 적합한 설계인 듯 하다. 

 

4. Fetchtype은 반드시 Lazy로!

수 많은 DB가 연결된 현업에서 Eager로는 관리하고 싶어도 할 수가 없다.

 

5. (이건 이미 알았지만) Service에서 읽기 작업만 수행하는 함수는 성능 향상을 위해 Transactional(readonly)로 수행

 

6. API 에서 엔티티를 사용하지 않는다. 

-> 엔티티를 수정하면 API 인터페이스 자체가 바뀐다. 아주 곤란

 

7. 복잡한 동적 쿼리는 QueryDSL을 적극적으로 사용하라

기존에 JPA의 Criteria는 너무 어렵고, String을 이어 붙이면 오류 발생 확률이 올라감
반면 queryDsl은 컴파일 과정에서 오류 잡기 쉽기에 안전하며 유지보수에 용이함.

 

 


기존에 코드를 작성하면서 사용했던 방식들과 유사한 측면들이 많았지만 이걸 왜 이렇게 작성하는 지에 대해 알게 된 강의였습니다. 

 

JPA라는 기술이 참.. 알고 쓰는 것과 모르고 쓰는 것에 차이가 날 수 밖에 없는 기술인 것 같은 데, 관련 공부를 조금 더 진행해보겠습니다!