티스토리 뷰
요약
- 디자인 생성API를 개발하여 버튼을 클릭하면 카드의 디자인을 커스텀하는 기능을 설명합니다.
디자인 생성 API
DesignController
@Slf4j
@RestController
@RequestMapping("/api/v1/design")
@RequiredArgsConstructor
public class DesignController {
private final DesignService designService;
private static final Long DEFAULT_MEMBER_ID = 3L;
@PostMapping
public ResponseEntity<Void> createDesign(@RequestBody DesignCreateRequest request) {
designService.createDesign(DEFAULT_MEMBER_ID, request);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}
DesignCreateRequest에는 color와 Character가 들어있습니다.
프론트 화면
배경색은 YELLOW, 캐릭터는 LALAPING을 클릭해 줍니다.
색깔 버튼을 누르고 확인을 누르면 색깔이 DB에 저장됩니다.
DesignService
public interface DesignService {
void createDesign(Long memberId, DesignCreateRequest request);
}
디자인을 생성할 때, request(색깔, 캐릭터)가 요구되고 memberId에 해당하는 곳에 저장할 것이기때문에 memberId와 request 파라미터를 받아줍니다.
DesignServiceImpl
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class DesignServiceImpl implements DesignService {
private final DesignRepository designRepository;
private final ChildRepository childRepository;
@Override
@Transactional
public void createDesign(Long memberId, DesignCreateRequest request) {
Child child = getChild(memberId);
validateCardState(child);
child.updateCardState(CardState.READY);
Design newDesign = Design.create(child, request.getColor(), request.getCharacter());
designRepository.save(newDesign);
}
private static void validateCardState(Child child) {
if(!child.getCardState().equals(CardState.NONE)) throw new WekidsException(ErrorCode.INVALID_CARD_STATE, "현재 카드 상태: " + child.getCardState() + "변경하려는 카드 상태: " + CardState.READY);
}
private Child getChild(Long memberId) {
return childRepository.findById(memberId).orElseThrow(() -> new WekidsException(ErrorCode.MEMBER_NOT_FOUND, "아이디: " + memberId));
}
}
Child child = getChild(memberId);
-> memberId를 통해 Child Entity를 가져옵니다.
validateCardState(child);
카드의 상태가 None이 아니면 예외처리, None이면 READY를 저장해줍니다. 카드상태가 CREATED는 생성이 이미 되었다는 뜻이고, NONE은 카드가 없다는 것, READY는 디자인 커스텀을 만들 준비가 되었다는 뜻 입니다.
Design newDesign = Design.create(child, request.getColor(), request.getCharacter());
new Design이라는 변수에 필요한 값들을 저장하고
designRepository.save(newDesign);
designRepository를 통해 DB에 저장해줍니다.
트러블 슈팅
#1 MapsId
Design Entity에서 MapId어노테이션에 괄호 열고 member와 mapping을 시켜주려 했으나 안되었습니다.
위에처럼 코드처럼 작성하면 member와 mapping할 수 있다고 합니다.
#2 enum type DB에 저장 안됨
enun type은 db에 저장되지 않는 상황이 발생했습니다. 그래서 Enumerated어노테이션을 사용해 문자열로 저장되도록 해결했습니다.
최종고민의 끝, 어떻게 스프링을 학습해야하지?
모든 코드는 외우기보단 이해에 초점을 두어 기록하는 습관을 가지려합니다. 기록하고, 여러번 반복해서 보는게 가장 도움이 되는 것 같습니다. Enumerated라는 어노테이션을 잊어버리더라도 괜찮으니 다음 프로젝트를 할때 enum타입은 문자열로 저장이 안될텐데, 혹은 어떤 어노테이션을 사용해야할거야. 라는 사고정도는 가지고 가야한다 생각합니다.
https://github.com/AnChanUng/WeKids-BE
GitHub - AnChanUng/WeKids-BE: 💰우리아이의 경제 습관 형성 BackEnd
💰우리아이의 경제 습관 형성 BackEnd. Contribute to AnChanUng/WeKids-BE development by creating an account on GitHub.
github.com
'spring' 카테고리의 다른 글
데이터베이스 커넥션 풀 (Connetion Pool, DBCP) (0) | 2024.12.17 |
---|---|
[SpringBoot] JUnit과 Mockito로 효율적인 테스트 코드 작성법 (0) | 2024.11.24 |
[JPA] 영속성 관리, 엔티티 매핑 (0) | 2024.08.30 |
DispatcherServlet (0) | 2024.08.13 |
Spring Boot 게시판 API - 댓글 구현 (0) | 2023.05.10 |
- Total
- Today
- Yesterday
- 25304번
- tmax tibero
- static #자바 메모리 구조 #멤버 변수
- 자바 #자바문법 #자바기초 #참조형 #기본형
- 서버 개발자
- server developer
- object 클래스 # java
- level3
- software enginner
- 서버 엔지니어
- 이분탐색
- java #예외처리 #throw #throws
- 2798블랙잭
- 주니어 백엔드 개발자
- level2
- server engineer
- Next.js
- java #추상클래스
- 넥슨개발자컨퍼런스
- Spring
- heap area #stack area #static area #jvm
- 단계10
- 브루트 포스법
- 정보처리기사 실기 #정처기 실기 #2024년 2회 #정처기 2024년 2회 #공부법 # 꿀팁
- 백엔드 개발자 로드맵
- ndc2025
- 나는야 4학년 #5학년 까지 가보자구
- 올 겨울은 조금 따뜻할 것 같다.
- 반복문
- tibero 7.23
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |