Search

[강의 요약] 김영한 - 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

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이 안 붙은 컨트롤러에서 엔티티를 조회해서 서비스 계층에 넘기면 준영속 상태로 다루게 되기 때문에 변경이 발생할 경우 예상치 못한 결과가 생길 수 있으니 주의