Skip to content

Commit

Permalink
feat: 사용자 회원가입 API 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
unanchoi committed May 18, 2024
1 parent 1dce1cc commit 1ccb4aa
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
@AllArgsConstructor
public enum SuccessMessage {
HEALTH_CHECK_SUCCESS("Health check success"),
MEMBER_SIGN_UP_SUCCESS("Member sign up success"),
TEST_IMAGE_UPLOAD_SUCCESS("Test image upload success");

private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package site.sopkathon.product.controller;


import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import site.sopkathon.product.common.message.SuccessMessage;
import site.sopkathon.product.common.response.BaseResponse;
import site.sopkathon.product.dto.request.member.MemberSignUpRequest;
import site.sopkathon.product.dto.response.member.MemberSignUpResponse;
import site.sopkathon.product.service.MemberService;

@RestController
@RequestMapping("/members")
@RequiredArgsConstructor
@Tag(name = "[Member API]", description = "회원 관련")
public class MemberController {

private final MemberService memberService;


@Operation(summary = "회원 가입", description = "회원 가입을 진행합니다.")
@ApiResponses(
value = {
@ApiResponse(responseCode = "201", description = "회원 가입 성공")
}
)
@PostMapping("/sign-up")
public ResponseEntity<BaseResponse<MemberSignUpResponse>> signUp(
@RequestBody final MemberSignUpRequest request
) {
final MemberSignUpResponse response = memberService.signUp(request);
return BaseResponse.created(SuccessMessage.MEMBER_SIGN_UP_SUCCESS, response);
}

}
19 changes: 14 additions & 5 deletions src/main/java/site/sopkathon/product/domain/Member.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package site.sopkathon.product.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import site.sopkathon.product.common.entity.BaseTimeEntity;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Getter
public class Member extends BaseTimeEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true, length = 50)
private String username;

@Builder
public Member(String username) {
this.username = username;
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package site.sopkathon.product.dto.request.member;

public record MemberSignUpRequest(
String username
) {
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package site.sopkathon.product.dto.response.member;

public record MemberSignUpResponse(
long userId
) {

public static MemberSignUpResponse of(long userId) {
return new MemberSignUpResponse(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
import site.sopkathon.product.domain.Member;

public interface MemberRepository extends JpaRepository<Member, Long> {

boolean existsByUsername(String username);
}
33 changes: 33 additions & 0 deletions src/main/java/site/sopkathon/product/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package site.sopkathon.product.service;


import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import site.sopkathon.product.common.exception.BadRequestException;
import site.sopkathon.product.domain.Member;
import site.sopkathon.product.dto.request.member.MemberSignUpRequest;
import site.sopkathon.product.dto.response.member.MemberSignUpResponse;
import site.sopkathon.product.repository.MemberRepository;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {

private final MemberRepository memberRepository;

@Transactional
public MemberSignUpResponse signUp(final MemberSignUpRequest request) {
if (!memberRepository.existsByUsername(request.username())) {
throw new BadRequestException("이미 존재하는 회원입니다.");
}
final Member savedMember = memberRepository.save(
Member.builder()
.username(request.username())
.build()
);
return MemberSignUpResponse.of(savedMember.getId());
}

}

0 comments on commit 1ccb4aa

Please sign in to comment.