본문 바로가기
WEB/Spring Boot

[Spring Boot] 쇼핑몰 #4 - 회원 도메인 개발

by JooRi 2024. 10. 11.
728x90
반응형
SMALL

2024.10.07 - [Spring Framework/Spring Boot] - [Spring Boot] 쇼핑몰 - 도메인 모델과 테이블 설계

 

[Spring Boot] 쇼핑몰 - 도메인 모델과 테이블 설계

* 요구사항 분석회원 기능회원 등록회원 조회상품 기능상품 등록상품 수정상품 조회주문 기능상품 주문주문 내역 조회주문 취소기타 요구사항상품은 재고 관리가 필요하다.상품의 종류는 도서

djjin02.tistory.com

2024.10.08 - [Spring Framework/Spring Boot] - [Spring Boot] 쇼핑몰 - 엔티티 클래스 개발

 

[Spring Boot] 쇼핑몰 - 엔티티 클래스 개발

2024.10.07 - [Spring Framework/Spring Boot] - 도메인 모델과 테이블 설계 도메인 모델과 테이블 설계* 요구사항 분석회원 기능회원 등록회원 조회상품 기능상품 등록상품 수정상품 조회주문 기능상품 주

djjin02.tistory.com

 

1. 회원 리포지토리 개발

JPA와 스프링을 사용해 DB에서 회원 정보를 처리하는 기본적인 회원 리포지토리 클래스이다.

 

MemberRepository.java

 

@Repository

스프링이 이 클래스를 레포지토리로 인식하고, DB 관련 작업을 자동으로 관리할 수 있게 하는 어노테이션

 

@RequiredArgsConstructor

final로 선언된 필드에 대한 생성자를 자동 생성해 주는 어노테이션. 

여기서는 EntityManager가 final로 선언되어 있으므로 이 필드가 생성자를 통해 주입된다.

 

private final EntityManager em;

스프링이 EntityManager 객체를 주입.

 

EntityManager

엔티티 객체를 DB에 저장, 수정, 삭제, 조회하는 작업을 수행하는 JPA의 주요 인터페이스이다.

JPA는 영속성 컨텍스트(엔티티 객체 저장소)를 통해 엔티티 객체를 관리하고, 트랜잭션이 끝날 때 DB와 동기화된다.

EntityManager의 주요 메서드들은 아래와 같다.

 

  • persist() : 엔티티 객체를 DB에 영속화(저장)
  • find() : DB에서 특정 ID의 엔티티 조회
  • createQuery() : JPQL 쿼리 생성, DB에서 복잡한 조회 작업 수행 
    • JPQL(Java Persistence Query Language) : 엔티티 객체를 대상으로 쿼리를 작성하는 객체 지향 쿼리 언어이다. 즉, DB 테이블 직접 참조 대신 엔티티 객체를 참조한다.
  • setParameter() : JPQL 쿼리에서 파라미터를 실제 값으로 대체
  • getResultList() : 쿼리 결과를 리스트 형태로 반환, 다수의 엔티티 객체를 조회할 때 사용

 

return em.createQuery("select m from Member m", Member.class)
        .getResultList();

 

EntityManager는 JPQL 쿼리를 실행할 수 있는 쿼리 객체를 생성하고,

getResultList()는 쿼리를 실제로 실행하고, 그 결과(Member 엔티티 객체들)를 리스트로 반환한다.

 

 

 return em.createQuery("select m from Member m where m.name = :name",
                        Member.class)
                .setParameter("name", name)
                .getResultList();

 

Member 엔티티에서 특정 name 값을 가진 데이터를 조회하는 JPQL 쿼리를 생성하고,

setParameter() 메서드를 통해 name 파라미터에 실제값이 할당되고,

해당 이름을 가진 모든 Member 객체들을 리스트로 반환한다.

 

2. 회원 서비스 개발

회원 가입, 화원 중복 검증 등 회원 관리 기능을 제공하는 클래스이다.

 

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
    private final MemberRepository memberRepository;

 

@Service : 이 클래스가 서비스 역할을 하는 컴포넌트임을 나타냄.

 

@Transactional(readOnly = true) : 모든 메서드에 데이터 변경이 없는 읽기 전용 트랜잭션을 설정.

 

@RequiredArgsConstructor

final로 선언된 필드에 대한 생성자를 자동 생성해 주는 어노테이션. 

여기서는 MmeberRepository가 final로 선언되어 있으므로 이 필드가 생성자를 통해 주입된다.

 

private final MemberRepository memberRepository;

회원 데이터를 관리하는 레포지토리 객체.

final로 선언되어 변경 불가능한 의존성이며, 생성자 주입 방식으로 스프링이 자동으로 MemberRepository 주입.

 

 

회원가입

 

// 회원가입
    @Transactional // 변경
    public Long join(Member member) {
        validateDuplicateMember(member); // 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

 

@Transactional

쓰기 트랜잭션 적용.

@Transactional(readOnly=true)가 기본 설정이었으나, 이 메서드에서는 데이터를 변경(회원 저장하는 작업을 수행하므로 쓰기 트랜잭션이 필요하다.

 

  • join() : 새로운 회원을 데이터베이스에 저장
    • validateDuplicateMember() : 회원가입 전 중복 회원 검증.
    • memberRepository.save(member) : 검증이 완료되면 MemberRepository를 통해 새로운 회원을 DB에 저장

join() 메서드가 호출되면 중복 회원을 검증한 후, 회원 정보를 save() 메서드로 DB에 저장한다.

 

 

중복 회원 검증

 

 private void validateDuplicateMember(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);
    }
}

 

3. 테스트

회원가입 테스트

회원가입 테스트

회원이 정상적으로 가입되고, DB에서 그 회원을 조회할 수 있는지 테스트.

 

중복회원 예외 테스트

중복 회원 예외 테스트

중복된 이름을 가진 회원이 가입할 때 예외가 발생하는지 테스트.

 

실행

 

DB

member1의 kim 데이터가 중복 없이 잘 들어갔다.

끝.

 


 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의 | 김영한 - 인프런 (inflearn.com)

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의 | 김영한 - 인프런

김영한 | 실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니

www.inflearn.com

본 게시글은 위 강의를 공부하고 정리한 글입니다.

728x90
반응형
LIST

댓글