Skip to content

Commit 08f384a

Browse files
committed
Feat: 계좌 등록/수정, 계좌 조회 api 구현
1 parent 7054630 commit 08f384a

8 files changed

Lines changed: 207 additions & 0 deletions

File tree

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package fitfit.domain.account.controller;
2+
3+
import fitfit.domain.account.dto.AccountRequestDTO.RegisterOrUpdateRequest;
4+
import fitfit.domain.account.dto.AccountResponseDTO.AccountInfoResponse;
5+
import fitfit.domain.account.service.command.AccountCommandService;
6+
import fitfit.domain.account.service.query.AccountQueryService;
7+
import fitfit.global.apiPayload.ApiResponse;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.media.Content;
10+
import io.swagger.v3.oas.annotations.media.Schema;
11+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
13+
import jakarta.validation.Valid;
14+
import lombok.RequiredArgsConstructor;
15+
import lombok.extern.slf4j.Slf4j;
16+
import org.springframework.web.bind.annotation.*;
17+
import org.springframework.http.ResponseEntity;
18+
19+
@Slf4j
20+
@RestController
21+
@RequestMapping("/api/accounts")
22+
@RequiredArgsConstructor
23+
@Tag(name = "Account", description = "계좌 관련 API")
24+
public class AccountRestController {
25+
26+
private final AccountQueryService accountQueryService;
27+
private final AccountCommandService accountCommandService;
28+
29+
@PutMapping
30+
@Operation(summary = "내 계좌 등록 및 수정 API", description = "로그인된 회원의 계좌 정보를 등록하거나 기존 정보를 수정하는 API입니다.")
31+
@ApiResponses({
32+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공"),
33+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "유효성 검사 실패 또는 JWT 오류.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
34+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "존재하지 않는 회원입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
35+
})
36+
public ApiResponse<AccountInfoResponse> registerOrUpdateAccount(
37+
@RequestHeader(value = "Authorization") String authorization,
38+
@Valid @RequestBody RegisterOrUpdateRequest request) {
39+
40+
AccountInfoResponse response = accountCommandService.registerOrUpdateAccount(authorization, request);
41+
return ApiResponse.onSuccess(response);
42+
}
43+
44+
@GetMapping
45+
@Operation(summary = "내 계좌 정보 조회 API", description = "로그인된 회원의 현재 등록된 계좌 정보를 조회하는 API입니다.")
46+
@ApiResponses({
47+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "OK, 성공", content = @Content(schema = @Schema(implementation = AccountInfoResponse.class))),
48+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "존재하지 않는 회원이거나 계좌 정보가 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),
49+
})
50+
public ResponseEntity<ApiResponse<AccountInfoResponse>> getAccountInfo(
51+
@RequestHeader(value = "Authorization") String authorization) {
52+
53+
AccountInfoResponse response = accountQueryService.getAccountInfo(authorization);
54+
return ResponseEntity.ok(ApiResponse.onSuccess(response));
55+
}
56+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package fitfit.domain.account.converter;
2+
3+
import fitfit.domain.account.dto.AccountRequestDTO.RegisterOrUpdateRequest;
4+
import fitfit.domain.account.dto.AccountResponseDTO.AccountInfoResponse;
5+
import fitfit.domain.account.entity.Account;
6+
import fitfit.domain.member.entity.Member;
7+
8+
public class AccountConverter {
9+
10+
public static AccountInfoResponse toAccountInfoResponse(Account account) {
11+
return AccountInfoResponse.builder()
12+
.accountId(account.getId())
13+
.bank(account.getBank())
14+
.account(account.getAccount())
15+
.field(account.getField())
16+
.build();
17+
}
18+
19+
public static Account toAccount(Member member, RegisterOrUpdateRequest request) {
20+
return Account.builder()
21+
.member(member)
22+
.bank(request.getBank())
23+
.account(request.getAccount())
24+
.field(request.getField())
25+
.build();
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package fitfit.domain.account.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
public class AccountRequestDTO {
11+
//계좌 등록/수정 요청 DTO
12+
@Getter
13+
@Builder
14+
@AllArgsConstructor
15+
@NoArgsConstructor
16+
public static class RegisterOrUpdateRequest {
17+
18+
@NotNull(message = "은행명을 입력해주세요.")
19+
@Schema(description = "은행명", example = "국민은행")
20+
private String bank;
21+
22+
@NotNull(message = "계좌번호를 입력해주세요.")
23+
@Schema(description = "계좌번호", example = "1234567890123")
24+
private String account;
25+
26+
@NotNull(message = "예금주명을 입력해주세요.")
27+
@Schema(description = "예금주명", example = "홍길동")
28+
private String field;
29+
}
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package fitfit.domain.account.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
public class AccountResponseDTO {
10+
@Getter
11+
@Builder
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
15+
public static class AccountInfoResponse {
16+
17+
@Schema(description = "계좌 고유 ID", example = "1")
18+
private Long accountId;
19+
20+
@Schema(description = "은행명", example = "국민은행")
21+
private String bank;
22+
23+
@Schema(description = "계좌번호", example = "1234567890123")
24+
private String account;
25+
26+
@Schema(description = "예금주명", example = "홍길동")
27+
private String field;
28+
}
29+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package fitfit.domain.account.entity;
2+
3+
import fitfit.global.entity.BaseEntity;
4+
import fitfit.domain.member.entity.Member;
5+
import jakarta.persistence.*;
6+
import lombok.*;
7+
import org.hibernate.annotations.DynamicInsert;
8+
import org.hibernate.annotations.DynamicUpdate;
9+
10+
@Entity
11+
@Builder
12+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
13+
@AllArgsConstructor
14+
@Getter
15+
@DynamicInsert
16+
@DynamicUpdate
17+
18+
public class Account extends BaseEntity {
19+
@Id
20+
@GeneratedValue(strategy = GenerationType.IDENTITY)
21+
@Column(name = "account_id")
22+
private Long id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "member_id", nullable = false)
26+
private Member member;
27+
28+
@Column(length = 50)
29+
private String bank; //은행명
30+
31+
@Column(length = 50)
32+
private String account; //계좌번호
33+
34+
@Column(length = 50)
35+
private String field; //예금주
36+
37+
public void update(String bank, String account, String field) {
38+
this.bank = bank;
39+
this.account = account;
40+
this.field = field;
41+
}
42+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fitfit.domain.account.repository;
2+
3+
import fitfit.domain.account.entity.Account;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import java.util.Optional;
6+
7+
public interface AccountRepository extends JpaRepository<Account, Long> {
8+
//Member ID로 계좌 조회
9+
Optional<Account> findByMemberId(Long memberId);
10+
}

src/main/java/fitfit/global/apiPayload/code/status/ErrorStatus.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public enum ErrorStatus implements BaseErrorCode {
4343
MEMBER_ALREADY_DELETED(HttpStatus.BAD_REQUEST, "MEMBER4011", "이미 탈퇴한 회원입니다."),
4444
MEMBER_ALREADY_AGREED_TERMS(HttpStatus.CONFLICT, "MEMBER4012", "이미 동의한 약관입니다."),
4545

46+
//계좌 관련
47+
ACCOUNT_NOT_FOUND(HttpStatus.NOT_FOUND, "ACCOUNT4001", "등록된 계좌 정보를 찾을 수 없습니다."),
48+
4649
;
4750
private final HttpStatus httpStatus;
4851
private final String code;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package fitfit.global.apiPayload.exception.handler;
2+
3+
import fitfit.global.apiPayload.code.BaseErrorCode;
4+
import fitfit.global.apiPayload.exception.GeneralException;
5+
6+
public class AccountHandler extends GeneralException {
7+
public AccountHandler(BaseErrorCode errorCode) {
8+
super(errorCode);
9+
}
10+
}

0 commit comments

Comments
 (0)