티스토리 뷰
repository
package jpabook2.jpashop2.repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jpabook2.jpashop2.domain.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor //autowired가 지원하기에 이것 또한 가능하다.final만 생성하기
public class MemberRepository {
//@PersistenceContext //자동으로 엔티티매니저를 만들어준다.
//@Autowired jpa에서 이렇게도 지원해준다
//private EntityManager em;
private final EntityManager em;
public void save(Member member){
em.persist(member);
}
public Member findOne(Long id){
return em.find(Member.class, id);
}
public List<Member> findAll(){//sql이 아닌 jtgl 이다.
return em.createQuery("select m from Member m", Member.class).getResultList();
}
public List<Member> findByName(String name){
return em.createQuery("select m from m where m.name = :name", Member.class)
.setParameter("name", name).getResultList();
}
}
service
package jpabook2.jpashop2.service;
import jpabook2.jpashop2.domain.Member;
import jpabook2.jpashop2.repository.MemberRepository;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(readOnly = true) //조회의 경우 읽기 전용으로 사용하면 리소스 사용 많이하지 않고 단순히 읽기 전용으로만 불러와 준다.여기서는 읽기가 더 많으니 이렇게 읽기전용으로 둔다음
//스프링 제공의 어노테이션을 사용하는 것을 권장함 (트랜잭션)
//@AllArgsConstructor 모든 필드 값에 대하여 빈 생성
@RequiredArgsConstructor // final이 붙은 필드값만 생성 *생성자 인젝션이란? 생성자를 통해 의존성 주입
public class MemberService {
private final MemberRepository memberRepository; //요즘에는 final을 붙이는 추세임..바꾸지 않기 때문
/* RequiredArgsConstructor 를 사용해서 생략 됌
public MemberService(MemberRepository memberRepository) { //테스트 코드 작성시 사용 및 생성할때 런타임 로딩 시 자동으로 memberRepository 생성
this.memberRepository = memberRepository;
}*/
//회원 가입
@Transactional //가입, 즉 save일 때에만 이렇게 따로 트랜잭션 어노테이션을 사용해준다. 디폴트는 readOnly = false임
public Long join(Member member){
// 중복 가입 회원 검증
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
//EXCEPTION
List<Member> findMembers = memberRepository.findByName(member.getName());
// 이렇게 EXCEPTION 으로 가입을 막을 수 있지만, db에 name을 유니크로 만들어 최후의 방어까지 하면 좋다.
if(!findMembers.isEmpty()){
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
}
//회원 전체 조회
public List<Member> findMembers(){
return memberRepository.findAll();
}
//회원 상세 조회
public Member findOne(Long memberId){
return memberRepository.findOne(memberId);
}
}
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 리터럴
- JPA
- SpringBoot
- 스프링공부
- 인터셉터
- react실행
- thymleaf
- 백엔드 개발자 역량
- filter
- 향해99
- React
- Java
- 항해99
- 향해플러스
- HTTP
- 로그인
- reject
- hypertexttransferprotocol
- BindingResult
- jpa api
- 예외처리
- rejectValue
- 스프링부트
- 컨트
- ArgumentResolver
- 백엔드 개발자 공부
- exception
- 항해플러스
- Intercepter
- 향해플러스백엔드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함