Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- kotlin
- transaction
- JPQL
- SpringBoot
- Thymeleaf
- java
- Exception
- Android
- 백준
- http
- QueryDSL
- 자바
- 그리디
- AOP
- 김영한
- pointcut
- Greedy
- db
- springdatajpa
- Spring Boot
- 스프링 핵심 원리
- 스프링
- spring
- Servlet
- jpa
- Proxy
- 알고리즘
- 스프링 핵심 기능
- JDBC
- 인프런
Archives
- Today
- Total
개발자되기 프로젝트
MemberService 개발 본문
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
'인프런 > [인프런] 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