https://github.com/woowacourse/jwp-chess/pull/354
https://github.com/woowacourse/jwp-chess/pull/451
레벨 2가 끝난 지는 조금 되었지만.. 뒤늦게라도 배운 내용을 정리하고자 글로 남긴다..ㅎㅎ 이번 미션에서는 레벨 1의 마지막 미션인 체스 미션을 가지고 와서 Spring을 적용하여 보는 미션이었다.
Spring을 학습하고 적용하는 경험이 이번이 처음이었기 때문에 많이 헤맸으며, 기능 하나가 정상적으로 작동하면 페어와 기쁨을 감추지 못했던 기억이 새록새록 난다😊
이번 미션에서는, 얕게라도 스프링의 동작 원리에 대해서 학습하려고 노력했던 것 같다.
Mapping
미션을 진행하면서 가장 먼저 중점적으로 적용했던 것은 컨트롤러에 @Controller 어노테이션을 붙여 주고, @GetMapping, @PostMapping 등의 어노테이션을 붙여 사용자의 요청 url, 메소드에 매핑되는 메서드가 호출되도록 변경하였다.
이전에는 직접 Spark의 메소드를 사용하여 get, post에 대응하도록 등록해 주어야 했는데, 어노테이션을 붙이기만 하니 직관적이고 훨씬 편하게 사용할 수 있었다.
get("/", webController::boardPage);
post("/move", webController::move);
post("/start", webController::start);
// 위보단.. 아래가 더 직관적이라고 느껴진다. 굳이 메소드를 통해 등록을 따로..
@Controller
public class Controller {
@GetMapping("/")
public String get() {
...
}
}
Controller vs RestController
또한, 이번 미션에서는 api와 view를 같이 제공하게 되었는데, 둘 다 하나의 Controller에서 처리해 주었었다. 이 점에 대해서도 리뷰어가 리뷰를 남겨 주셔서 찾아보고 주변 크루들과 이야기를 해 보니 @Controller에서는 view를 반환하는 것이 일반적이고, api에 관한 것은 @RestController에서 처리해 주는 것이 더 깔끔해 보이는 구조인 거 같다는 생각이 들었다.
물론 @Controller에 @ResponseBody를 붙여주면 되지만, @RestController이 @Controller에 @ResponseBody가 붙어있는 것인데 굳이..? 따라서 컨트롤러를 view용 컨트롤러, api용 컨트롤러로 나누어 주었다.
@Transactional
마지막으로, 레벨 2를 돌아보며 가장 많이 사용하게 되는 어노테이션중 하나인 @Transactional 어노테이션을 학습하는 계기가 되었다. 기존 프로젝트의 문제점은 체스 판을 저장할 때, 체스 말을 하나씩 db에 저장하게 될 텐데 그렇다면 중간에 서버가 종료되게 된다면 체스 말이 저장되다가 마는 문제점이 생긴다.
이러한 점을 해결하기 위해서, 체스 말을 db에 저장해주는 부분을 트랜잭션으로 묶어서 처리하였다. 트랜잭션으로 묶어서 처리하게 된다면 중간에 서버가 종료되게 된다면 롤백되어 아예 체스 말을 저장하기 전으로 돌리게 되므로 일관성 있게 데이터를 처리할 수 있다.
마치며
체스 미션을 통해서 기존 작성한 프로젝트를 Spring으로 옮기면서 대략적인 Spring 사용법에 대해서 학습할 수 있어서 좋았다. 또한 기존 프로젝트의 코드가 Spring에선 어떻게 작성하면 되는지 방식이 매핑되다 보니 이해하기 쉬웠던 것 같다.
'활동 > 우아한 테크코스' 카테고리의 다른 글
[ Lv 1 ] 체스 미션 4, 5단계 후기 (0) | 2022.04.17 |
---|---|
[ Lv 1 ] 체스 미션 1,2,3단계 (0) | 2022.04.16 |
[ Lv 1 ] 블랙잭 미션 2단계 후기 (0) | 2022.04.15 |
[ Lv 1 ] 블랙잭 미션 1단계 후기 (0) | 2022.04.11 |
[ Lv 1 ] 로또 미션 2단계 후기 (0) | 2022.03.14 |