스프링 부트와 JPA 활용1 - 회원 도메인 개발 2 & Lombok 적용

JOY·2022년 3월 28일
0
post-thumbnail

📌 스프링 부트와 JPA 활용1 - 회원 도메인 개발 2

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


회원 도메인 개발 목차

1. 회원 리포지토리 개발

2. 회원 서비스 개발

3. 회원 기능 테스트


1. 회원 서비스 개발

1) 회원 서비스 (MemberService.java)

💻 코드

package jpabook.jpashop.repository;
package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    //값 변경 X - final
    private final MemberRepository memberRepository;

    /* 회원가입 */
    public Long join(Member member){
        validateDuplicatedMember(member); //중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicatedMember(Member member) {

        List<Member> findMembers = memberRepository.findByName(member.getName());
        if(!findMembers.isEmpty()){
            throw new IllegalStateException("이미 존재하는 회원입니다");
        }
;    }

    /* 회원 전체 조회 */
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    /* 특정 회원 조회 */
    public Member findOne(Long memberId){
        return memberRepository.findOne(memberId);
    }
}

👉 설명
1) 기술

  • @Transactional : 트랜잭션, 영속성 컨텍스트
    JPA에서 모든 데이터 변경과 로직들은 트랜잭션안에서 실행되어야 한다.
    • readOnly = true : 읽기 전용 메서드에 사용, JPA가 조회하는 곳 성능 최적화
  • @RequiredArgsConstructor : final 필드만 생성자 생성

2) 기능

  • join() : 회원 가입
  • validateDuplicatedMember() : 중복 회원 검증
    • 동시 DB insert 문제 예방, 멀티쓰레드 상황 고려하여 유니크 제약 조건 추가
  • findMembers() : 회원 전체 조회
  • findOne() : 특정 회원 조회

2. 주입

필드 주입

public class MemberService {

    @Autowired
    private MemberRepository memberRepository;}

생성자 주입

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
	}}

❗ 엔티티 매니저
@Autowired 뿐만 아니라 @PersistenceContext 표준 어노테이션 있어야 주입
그러나 스프링 데이터 JPA를 사용하면 @Autowired만 사용해도 주입 가능
🧷 생성자 하나면, @Autowired 생략 가능

3. 💡 Lombok 적용

  • @AllArgsConstructor : 클래스에 존재하는 모든 필드 생성자 자동 생성
  • @RequiredArgsConstructor : final 필드에 대한 모든 필드 생성자 자동 생성

MemberService.java - lombok 적용

@AllArgsConstructor 사용 코드

@Service
@Transactional(readOnly = true)
@AllArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;}

@RequiredArgsConstructor 사용 코드

@Repository
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;}

MemberRepository.java - lombok 적용

  • 생성자 주입
@Repository
public class MemberRepository {

    private final EntityManager em;

    public MemberRepository(EntityManager em) {
        this.em = em;
    }}

위의 코드를 아래처럼 사용 가능

  • @RequiredArgsConstructor 사용 코드
@Repository
@RequiredArgsConstructor
public class MemberRepository  {

    private final EntityManager em;}
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글