Last update: @3/6/2023
주의
본 포스팅은 인프런 강의를 통해 학습한 내용을 임의로 요약한 것으로 일부 내용의 오류 및 누락, 링크 숨김 등이 존재합니다.
테이블, 컬럼명 생성 전략
•
엔티티 필드 → 테이블 컬럼
◦
하이버네이트 기존 전략
▪
엔티티의 필드명을 그대로 테이블의 컬럼명으로 사용
◦
스프링 부트 신규 설정
1.
카멜 케이스 → 언더스코어
2.
점(.) → 언더스코어(_)
3.
대문자 → 소문자
▪
예: memberPoint → member_point
리포지토리에 EntityManager 주입
•
@PersistenceContext: EntityManager 주입
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
...
}
Java
복사
◦
스프링 부트에서는 @Autowired로 대체 가능
•
@PersistenceUnit: EntityManagerFactory 주입
서비스 계층 @Transactional
•
readOnly=true 옵션으로 영속선 컨텍스트를 플러시 하지 않도록 해서 약간의 성능 향상
•
쓰기 작업을 하는 메서드에만 @Transactional을 붙여줌
@Service
@Transactional(readOnly = true)
public class MemberService {
...
@Transactional
public Long join(Member member) {
validateDuplicateMember(member); // 중복 회원 검증
memberRepository.save(member);
return member.getId();
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Member findOne(Long memberId) {
return memberRepository.findOne(memberId);
}
...
}
Java
복사
도메인 모델 패턴과 트랜잭션 스크립트 패턴
•
도메인 모델 패턴
◦
엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 방식
•
트랜잭션 스크립트 패턴
◦
엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 방식
JUnit @RunWith(SpringRunner.class) 어노테이션
•
모든 스프링 context를 로드하지 않고 테스트에서 @Autowired 또는 @MockBean이 붙은 것들에 대해서면 context를 로드하여 테스트를 경량화함
◦
JUnit4에서는 사용
◦
JUnit5부터는 @SpringBootTest에 기본적으로 붙어있기 때문에 써줄 필요 없음
form 객체 vs 엔티티 직접 사용
•
form 객체를 따로 만들어서 사용하는 것을 권장
◦
화면 요구사항이 복잡해지면 엔티티에 화면을 처리하기 위한 기능이 계속 추가되며 지저분해짐
◦
엔티티는 핵심 비즈니스 로직만 가지고 있고 화면을 위한 로직은 없어야 함
엔티티 변경 감지와 병합
•
준영속 엔티티를 merge를 통해 영속성 컨텍스트에 새로 넣거나 병합할 수 있음
◦
하지만 merge하는 객체에 null값이 있을 경우 기존의 엔티티에 값이 있어도 null로 업데이트 해버림
◦
따라서 form 객체 등을 항상 유지해줘야하는데 엄청 번거로움
•
따라서 준영속 엔티티를 변경할 때는 find를 이용해 기존 엔티티를 영속성 컨텍스트로 올려서 받은 후 변경 감지 사용
◦
컨트롤러에서 어설프게 엔터티를 생성하지 말 것
◦
트랜잭션이 있는 서비스 계층에 식별자(id)와 변경할 데이터를 파라터 또는 DTO를 통해 명확하게 전달
◦
트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고 엔티티의 데이터를 직접 변경
◦
트랜잭션 커밋 시점에 변경 감지가 실행됨
•
setter 대신 의미 있는 변경 메서드를 사용해야 나중에 변경 포인트를 추적해서 변경 시점을 정확히 알 수 있게 됨(예> updateItem())
•
@Transactional이 안 붙은 컨트롤러에서 엔티티를 조회해서 서비스 계층에 넘기면 준영속 상태로 다루게 되기 때문에 변경이 발생할 경우 예상치 못한 결과가 생길 수 있으니 주의