package org.example.chatproject.member.controller;
import org.example.chatproject.member.domain.Member;
import org.example.chatproject.member.dto.MeberSaveReqDto;
import org.example.chatproject.member.service.MemberService;
import org.springframework.http.HttpStatus;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@PostMapping("/create") //HTTP meg랑 회원id을 리턴할 것
public ResponseEntity<?> memberCreate(@RequestBody MeberSaveReqDto memberSaveReqDto) {
Member member = memberService.create(memberSaveReqDto);
return new ResponseEntity<>(member.getId(), HttpStatus.CREATED);
}
}
- @RequestingMapping("/member") :
이 컨트롤러의 기본 URL 경로를 /member로 설정
즉, 이 컨트롤러에 정의된 API는 http://localhost:8080/member/... 같은 URL에서 접근할 수 있다. - @PostMapping("/create")
앞의 /member/create 의 형태로 post형태로 요청을 보낸다 - @PostMapping("/create")는 HTTP POST 요청을 처리하는 어노테이션요청을 할때는, @RequestBody MemberSaveReqDto ...의 형태의 json 형태로 받아주겠다.
그리고 memberService에게 전달하겠다. 그리고 MemverService가 전달받으면, 데이터베이스에 저장을 하겠다는 것
그리고 저장된 객체를 return 받을 것이다 그리고 ResponseEntity 를 사용하여 맴버의 상태와 코드까지 받을 수 있게 받을 것이다.
정리하면, 회원 정보를 서버에 저장할 때 사용되는 API - memberService.create(memberSaveReqDto) :호출해서 회원 정보를 저장
반환된 Member 객체를 member 변수에 저장
create 는 객체 메서드 함수로 회원정보를 저장할 것
✔️ 여기서 memberService.create(memberSaveReqDto)를 호출하는 것이 핵심
즉, Controller는 직접 DB를 다루지 않고, Service에게 요청을 전달하는 역할
정리:
MeberSaveReqDto = 회원가입 요청 데이터를 담는 DTO
memberService = 회원 관련 비즈니스 로직을 담당하는 서비스
ResponseEntity = HTTP 상태 코드를 제공하는 클래스
@RestController : 이 클래스가 REST API 컨트롤러임을 나타낸다. @Controller와 달리, 자동으로 JSON 형식으로 응답을 반환
@RequestMapping("/member")
- @RestController → REST API를 제공하는 컨트롤러
- @RequestMapping("/member") → 기본 URL 경로 /member
- @PostMapping("/create") → POST 요청으로 회원을 생성
- @RequestBody MeberSaveReqDto → 클라이언트에서 보낸 JSON 데이터를 받아서 객체로 변환
- memberService.create(memberSaveReqDto) → 회원 정보를 저장하는 서비스 호출
- ResponseEntity<>(member.getId(), HttpStatus.CREATED) → 생성된 회원의 ID와 상태 코드(201)를 응답으로 반환
MemberService
package org.example.chatproject.member.service;
import jakarta.transaction.Transactional;
import org.example.chatproject.member.domain.Member;
import org.example.chatproject.member.dto.MeberSaveReqDto;
import org.example.chatproject.member.repository.MemberRepository;
import org.springframework.stereotype.Service;
@Service
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public Member create(MeberSaveReqDto meberSaveReqDto) {
//이미 가입되어 있는 이메일을 검증한다
if(memberRepository.findByEmail(meberSaveReqDto.getEmail()).isPresent()) {
throw new IllegalArgumentException("Email is already in use");
}
Member newMember = Member.builder()
.name(meberSaveReqDto.getName())
.email(meberSaveReqDto.getEmail())
.password(meberSaveReqDto.getPassword())
.build();
Member member = memberRepository.save(newMember);
return member;
}
}
@Service
- 이 클래스가 서비스 역할을 한다고 스프링에게 알려준다.
- 컨트롤러(Controller)가 요청을 보내면, 이 서비스가 처리
@Transactional
- 데이터베이스(DB)에 데이터를 저장하거나 변경할 때 문제가 생기면 자동으로 롤백(취소) 한다.
- 예를 들어, 회원을 저장하는 도중 오류가 나면, DB에 저장된 내용이 자동으로 취소된다.
Member newMember = Member.builder()
.name(meberSaveReqDto.getName())
.email(meberSaveReqDto.getEmail())
.password(meberSaveReqDto.getPassword())
.build();
- Member.builder() → 새로운 회원 객체를 만든다.
- name(meberSaveReqDto.getName()) → 사용자가 입력한 이름 설정.
- email(meberSaveReqDto.getEmail()) → 사용자가 입력한 이메일 설정.
- password(meberSaveReqDto.getPassword()) → 사용자가 입력한 비밀번호 설정.
- .build(); → 회원 객체 완성!
Member member = memberRepository.save(newMember);
- memberRepository.save(newMember);
- newMember(새로운 회원)을 DB에 저장한다. 아직은 디비에 저장된 상태가 아니다.
- save()는 Spring Data JPA에서 제공하는 메서드
저장된 회원 정보를 member 변수에 저장한다.
newMember 안에 저장된 것을 member을 통해 DB를 저장한다
Postman 에서 날려보기
{
"name" : "수아",
"email" : "sua@naver.com",
"password" : "1234"
}
return new ResponseEntity 에서 member.getID 를 반환하기로 했기 때문에 post하면 1 을 반환한다.
DB에도 정상적으로 들어간 것을 알 수 있다.
다시 지금까지 한 거 정리
- DTO : 데이터 전송을 하는 객체로 계층 간 데이터 교환을 위해 사용된다.
- Service : 비즈니스 로직을 처리하는 계층. 클라이언트의 요청을 받아 필요한 작업을 수행하고, 결과를 반환한다.
주로 데이터 처리, 검증, 트랜잭션 관리 등읠 역할을 한다. - Repository : 데이터베이스와의 상호작용을 담당하는 계층이다. 주로 데이터의 저장, 조회, 수정, 삭제 등의 작업을 수행한다.
예)
// 이메일로 회원 조회 메서드
Optional<Member> findByEmail(String email);
흐름정리
1. 클라이언트가 회원가입 요청을 보낸다. (DTO 형태의 데이터)
2. Controller가 요청을받아 MemberService 의 create 메서드를 호출한다.
3. Service 는 DTO 를 사용하여 비즈니스 로직을 처리한다.
- 이메일 중복 체크
- Member 객체 생성
- MemberRepository 를 통해 DB에 저장
4. Repository는 DB와 상호작용을 하며 데이터를 저장하거나 조회한다.
5. Service 는 처리 결과를 Controller에 반환하고, Controller는 클라이언트에게 응답한다.
JpaRepository<Member, Long>을 상속하면,
save(), findById(), findAll(), deleteById() 같은 기본적인 기능을 자동으로 제공
사용자(클라이언트) → Controller → Service → Repository → DB
1. 클라이언트 요청 사용자가 /member/create로 회원가입 요청을 보냄.
2. Controller (MemberController) 요청을 받고, memberService.create()를 호출.
3. Service (MemberService) 비즈니스 로직 수행 (이메일 중복 체크 → Member 객체 생성 → DB 저장).
4. Repository (MemberRepository) save()를 통해 DB에 회원 데이터 저장.
5. DB 저장된 데이터를 다시 Service로 반환.
6. Controller 저장된 회원의 ID를 클라이언트에게 응답으로 반환.
'아무거나 공부' 카테고리의 다른 글
[HTTP] HTTP API에 대해서 (0) | 2025.03.15 |
---|---|
[프로젝트] 채팅방만들기 - 도메인구성 (0) | 2025.03.03 |