😒 저 저 저 개념없는 나/🌱 Spring

[CNU SW academy | BE] Member 객체 관련 코드 설명

우주수첩 2023. 8. 23. 09:52
728x90

1. Entity / Member

 

import jakarta.persistence.*;
import lombok.*;

@Entity // JPA의 entity임을 나타냄
@Getter
@Setter
@NoArgsConstructor // 매개변수 없는 생성자
@AllArgsConstructor // 매개변수 이쓴 생성자
@Builder
public class Member {
    @Id // 아래 필드가 엔티티의 기본 키(pk)임을 나타냄
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동으로 증가되는 Identity 전략을 사용하여 pk의 값을 생성. 
    @Column(name="memberId") // db의 coulumn과 매핑되는 엔티티 클래스의 필드에 대한 정보 제공.  : memberId로 매핑
    private Long id;

    private String userId;

    // Member 라는 객체의 정보를 저장.
    // 우리는 ERD에 우선적으로 MemberID만 저장했기에 사용자를 식별하는 변수만 선언.
    // 얘네를 저장하는 공간이 repositody/MemberRepository 인터페이스
    // id : 사용자의 고유 id 번호 식별 : 자동 지정. 고유 번호.
    // userId : 사용자가 회원가입 시 입력한 사용자 id


}

 

 

 

2. repository/MemberRepository

import com.team7.be.domain.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository // 컨테이너에서 관리되는 repo의 역할을 수행함을 나타냄
public interface MemberRepository extends JpaRepository<Member,Long> {
    //Spring Data JPA를 사용 : Member 엔티티와 관련된 데이터베이스 조작을 수행할 수 있는 메소드들을 자동으로 생성하도록 해줌. 
    //JPA는 그냥 사용하는 것 이 아닌 build.gradle의 dependency에 선언해서 사용가능.
    // JPA는 기본적인 CRUD 조작 메소드를 포함하고 있음. 
    // Member : 엔티티 클래스 타입 / Long : PK

    Optional<Member> findByUserId(@Param("userId")String userId);
    // memberId를 받아와 저장되어있는 레포지토리에서 Id를 가지고 있는 Member객체를 반환한다.
    // 이 repo에 대한 저장 및 탐색 등의 메소드 작업을 진행하는 곳은 service.MemberSerive
    //JPA의 네이밍 규칙을 따르고 있음. userId라는 column값을 사용해서 멤버를 조회하는 메소드.
}

//Optional : 값이 존재할 수도 그렇지 않을수도 있는 상황을 처리하기 위해 사용.
// NullPointException같은 상황을 방지하고 코드의 안정성을 높이기 위해 사용.

 

 

3. service/MemberService

package com.team7.be.domain.service;


import com.team7.be.domain.controller.request.member.SignUpRequest;
import com.team7.be.domain.entity.Member;

import lombok.RequiredArgsConstructor; // 자동으로 필드값들을 가진 final 타입의 생성자를 만들어줌.
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service // Spring에 등록되어있는 service임을 의미
@RequiredArgsConstructor // 필드 주입에 도움을 준다. 
@Transactional(readOnly = false) // 현재 클래스 내의 메소드 들은 트랜잭션 내에서 실행된 것임을 나타낸다. 읽기권한부여를 해제함으로써 트랜젝션 내에서 데이터 변경이 가능함을 의미한다.
public class MemberService {
    private final MemberRepository memberRepository;


    @Transactional
    public String signUp(SignUpRequest signUpRequest){
        checkDuplicateMemberId(signUpRequest.getUserId());
        // 사용자의 id를 가져와서 이미 repository에 존재하는 userid인지 체크
        Member member = Member.builder()
                .userId(signUpRequest.getUserId())
                .build();
        // 사용자로부터 전달된 member정보(signUpRequest)에서 필요한 정보(memberID)를 가져와 Member엔티티를 build한다.
        return memberRepository.save(member).getUserId(); // 저장한 member의 userid를 반환한다.
    } // Controller에서 해당 메소드 사용

    private void checkDuplicateMemberId(String userId){
        if(memberRepository.findByUserId(userId).isPresent()){
            System.out.println("이미 존재하는 id입니다.");
        }
        //member에 대한 정보를 저장하고있는 repo에서 입력받은 userid가 존재하는 지에 대한 여부를 판단.
        // 이미 member 정보가 존재할경우 이를 알림.
    }
}

 

 

 

4. Controller/MemberController


import com.team7.be.domain.controller.request.member.SignUpRequest;
import com.team7.be.domain.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.net.URI;
import static org.springframework.web.util.UriComponentsBuilder.fromPath;



@RequiredArgsConstructor
@RestController
public class MemberController {
    private final MemberService memberService;

    @PostMapping("/signUp")
    public ResponseEntity<Void> signUp(@RequestBody SignUpRequest signUpRequest){
        String  userId = memberService.signUp(signUpRequest);
        //service의 signUp 메소드를 사용하여 저장된 의 고유 id를 저장
        URI uri = fromPath("/member/{userId}")
                .buildAndExpand(userId)
                .toUri();
        //회원가입 진행 시 사용자별로 식별할 수 있는 그들읠 userId를 uri에 지정하여 개별적인 endpoint로 이동할 수 있도록 한다.
        return ResponseEntity.created(uri).build();

    }
    
    //회원 가입을 처리하는 메소드입니다. 요청의 본문에 있는 정보를 SignUpRequest 객체로 받아와서 MemberService의 signUp 메소드를 호출하여 회원 가입을 진행하고, 생성된 회원 아이디를 반환합니다.
}

 

 

 

4.1 Controller/Request/member/SignupRequest

package com.team7.be.domain.controller.request.member;
import lombok.*;

@Getter
@Setter
@NoArgsConstructor // 파라미터 없는 기본 생성자
@AllArgsConstructor // 모든 필드를 포함하는 생성자
@Builder
public class SignUpRequest {
    private String name;
    private String userId;
    private String password;

}

// 이렇게 정의된 SignUpRequest 클래스는 웹 요청 본문에 포함되는 데이터를 담기 위한 클래스로 사용.
// 클라이언트가 회원 가입 요청을 보낼 때, 요청 본문에 name, userId, password 정보를 담아서 서버로 전송하면, 이 클래스의 객체로 자동으로 변환되어 컨트롤러에서 사용될 수 있음.
728x90