Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

MemberService 개발 본문

인프런/[인프런] Springboot와 JPA활용 1

MemberService 개발

Seung__ 2021. 8. 6. 01:35

1. Member Service


  • @Service : 컴포넌트 스캔 대상, 스프링 빈으로 등록
  • @Transactional : JPA의 모든 데이터 변경 및 로직은 transaction에서 실행되어야 함.
    - class에 적용되면 각 메서드마다 적용됨
    - 메서드에 추가로 @Transactional이 있다면 메서드에 걸린게 우선순위 높음
    - 조회 메서드는 가급적 readOnly = true를 적용하자.
  • @GeneratedValue에 의해 DB마다 전략이 다르긴 하지만 id를 자동으로 생성함.
    - Persist 시점에 PK인 id는 DB에 저장되기 위해 필요함.
    - 즉 DB 에 반영되기 이전에도 Persist시점에 PK존재는 보장됨.
//@Transactional //JPA의 모든 데이터 변경 및 로직은 transaction에서 실행되어야 함. 클래스에 지정하면 메서드마다 걸림.
@Service
@Transactional(readOnly = true)//JPA가 조회하는 메서드에 좀더 최적화됨.읽기에는 가급적 readOnly 적용.
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

    /**
     * 회원 가입
     */
    @Transactional
    public Long join(Member member){
        //중복회원 검증
        validateDuplicateMember(member);
        memberRepository.save(member); //Persist시점에 id 존재 보장됨. id가PK기 때문에 DB에 저장되기 위해서 필요함.
        return member.getId();
    }


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

    /**
     * 전체 회원 조회
     */
    //@Transactional(readOnly = true) //JPA가 조회하는 메서드에 좀더 최적화됨.
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    /**
     * 회원 한 명 조회 by id
     */
    //@Transactional(readOnly = true) //읽기에는 가급적 readOnly 적용.
    public Member findOne(Long id){
        return memberRepository.findOne(id);
    }

}

 

 

2. EntityManager 주입(MemberRepository)


  • SpringDataJPA를 사용하지 않으면 EntityManager 주입위해서는
  • JPA 표준 annotaion인 @PersistenceContext를 사용해야 했다.
  • 하지만 SpringDataJpa는 @Autowired를 통한 EntityManager 주입을 지원한다.
  • 따라서 @RequiredArgsConstructor, final 키워드 조합으로 쉽게 주입할 수 있다.
  • 코드도 간단해진다 ㅎ
    @Repository //스프링 빈으로 등록, 컴포넌트 스캔.
    @RequiredArgsConstructor
    public class MemberRepository {
    
        //lombok으로도 쌉가능. 스프링DataJPA가 @Autowired로 em 주입 가능하도록 지원함.
        private final EntityManager em;​

3. GitHub : 210806 Member Service


 

GitHub - bsh6463/SpringBootJPA1

Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글

상품 domain, repository, service개발  (0) 2021.08.06
회원 기능 테스트  (0) 2021.08.06
회원 도메인 개발  (0) 2021.08.06
엔티티 설계 시 주의점  (0) 2021.08.06
엔티티 클래스 개발  (0) 2021.08.05
Comments