각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 2 회고 (74일차)

제이온 (Jayon) 2021. 4. 16.

안녕하세요? 제이온입니다.

 

오늘은 오전에 수업이 있었고, 오후에는 처음으로 오프라인 포수타를 경험하였습니다. 특히, 포수타에는 특별한 이벤트가 있었기에 검프와 페어 프로그래밍은 오래 못했습니다.

 

 

데일리 미팅

오늘의 데일리 미팅 진행자는 아론이지만, 제이슨이 스프링 학습 방향에 대한 조언을 해 주셨습니다. 저를 비롯한 스프링 입문자들을 위해 학습 테스트 외에 무엇을 가지고 추가 학습을 할지 알려주셨죠. 요약하자면, 흔히 보라돌이 책이라고 불리는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 구매하여 배포 전까지 스프링 기능을 따라친 이후 인프런 김영한님, 백기선님의 무료 인강을 들어보는 것입니다. 그리고 배운 기능을 잘 이용해서 앞으로 있을 우테코 미션에 적용해 보는 것이죠. 이를 듣고, 저는 바로 보라돌이 책을 질렀습니다 ㅎㅎ

 

 

포수타

오전에 브라운의 Spring JDBC 수업을 듣고 점심을 검프와 먹은 뒤, 오후 2시에 포수타를 들었습니다. 그리고 보라돌이 책의 저자 이동욱님께서 특별 게스트로 나와주셨습니다. 따라서, 포수타가 아니고 이수타로 바뀌게 되었습니다. 크루들이 다양한 질문을 해 주셨고, 그 과정에서 이동욱님이 얼마나 독하게 살아왔는지 알 수 있었습니다.

 

그 예로, 1일 1커밋을 5년동안 진행하셨는데, 입원한 상황에서도 노트북을 들고 와서 커밋했다고 합니다.. 또한, 여자친구를 사귀기 전에는 주말에도 하루종일 개발을 하는등 정말로 열심히 살아오신 것에 감탄했습니다. 저도 이정도는 아니지만 저만의 페이스를 잘 유지하면서 성실하게 살아야겠다고 다짐했습니다.

 

포수타가 끝난 뒤, 이동욱님과 함께 사진을 찍고 팬(?)싸인회를 진행했습니다. 저는 오늘 이분을 처음 보지만, 왠지 해야만 할 것 같은 분위기에 싸인을 받고 악수를 나눴습니다. 이 싸인은 코팅해서 집에 잘 모셔둘 계획입니다.

 

 

스프링 입문 - 체스 미션 페어 프로그래밍

어제 게임 도중 종료 버튼 기능 관련 버그를 고치면서 1단계 미션은 일단락된 줄 알았습니다. 하지만, 새로고침을 하면 게임 종료가 된 것으로 판단되지 않는 문제가 생겼습니다. 다행히, 이 부분은 프로덕션 코드에서 코드를 재사용하다가 잘못 가져온 것이었고, 검프가 잘 찾아서 해결해 주었습니다.

 

그래서 정말 다 끝난 줄 알고, 기분 좋은 마음으로 체스를 진행했는데, 이제는 정말 원인을 알 수 없는 버그가 발견되었습니다. 바로, 체스말을 빨리 움직이다보면, 어느 순간 이동 관련 DB가 꼬이는 것이었죠. 예를 들면, c2에서 c4로 이동되었다고 콘솔 로그에 찍히고 DB 데이터에도 들어왔는데, 어떠한 이유에서인지 체스말은 c2에서 c4로 이동되어 있지 않습니다. 그 외에는 c2에서 c4로 분명 이동시켰는데, g3에서 g4로 가는 데이터도 들어오는 등, 빠르게 이동을 하면 문제가 발생했습니다.

 

다만, 1.x초라는 짧은 시간 안에 체스말을 움직여야 하는 것이다보니까 일단은 이 버그를 TODO에 적어만 놓기로했습니다. 왜냐하면, 이걸 고치다가 Spring을 아예 오늘 구현하지 못할 것 같기 때문이었죠.

 

 

저는 스프링에 대해 문외한이었어서 처음 구조를 잡는 것은 검프가 진행해 주었습니다. 처음에는 컨트롤러를 정의해야 하는데, 단순히 페이지 렌더링은 ChessGameController, api 통신 관련 컨트롤러는 ChessGameApiController로 정의해 주었습니다. 이때, 렌더링은 @Controller을, api 통신 관련은 @RestController 어노테이션을 붙였는데 둘의 차이를 알아봐야겠습니다.

 

이후에는 페이지 렌더링을 위하여 MVC 학습 테스트에서 배웠던 @GetMapping을 사용했습니다.

 

 

    @GetMapping("/")
    public String main() {
        return "main";
    }

 

 

여기서 흥미로운 점은, 분명 "main"이라는 String을 반환하는데 실제로는 main.html을 찾아서 반환해 준다고 합니다. 다만, 아래와 같은 설정을 추가해야 정상적으로 작동한다고 하네요.

 

 

handlebars:
  prefix: classpath:templates/
  suffix: .html

 

 

이것을 추가해야 하는 이유는 내일 자세히 알아볼 생각입니다.

 

 

    @GetMapping("/games")
    public String startPage(Model model) {
        TilesDto tilesDto = chessService.emptyBoard();
        model.addAttribute("tilesDto", tilesDto);
        return "board";
    }

 

 

비슷한 방식으로, 체스판을 띄우는 페이지도 작성해 줍니다. 다만, 이 페이지는 모델을 받아와서 board.html과 함께 전송해야 합니다. 이때는 스파크 자바의 Map의 put()을 한 것처럼 addAttribut() 메소드를 사용합니다.

 

이때, ChessService는 @Service인 클래스여야합니다.

 

 

@Service
@Transactional(readOnly = true)
public class SpringChessService {

    private final ChessDao chessDao;
    private final MovementDao movementDao;

    public SpringChessService(final ChessDao chessDao, final MovementDao movementDao) {
        this.chessDao = chessDao;
        this.movementDao = movementDao;
    }

    public TilesDto emptyBoard() {
        return new TilesDto(Board.emptyBoard());
    }
}

 

 

또한, 여기서 사용되는 Dao 객체는 @Repository를 설정해 주어야 하죠. 참고로, @Transactional은 DB에서 말하는 그 트랜잭션입니다.

 

 

@Repository
public class JDBCChessDao implements ChessDao {
    @Override
    public void save(Chess chess) {

    }

    @Override
    public Optional<Chess> findByName(String name) {
        return Optional.empty();
    }

    @Override
    public void update(Chess chess) {

    }

    @Override
    public void deleteByName(String name) {

    }
}

 

 

위와 같이 @Repository를 붙인 후, JDBC 템플릿을 이용하여 Dao를 정의해 주면 됩니다.

 

 

여기까지 검프가 각 어노테이션의 특징을 잘 설명해 주면서 코드를 작성해 주었습니다. 이제 나머지 부분인 '서비스의 에러 처리', 'Dao 정의', 'api 통신 컨트롤러 정의'는 각자 구현한 다음, 코드를 함께 보면서 토론해 보기로 하였습니다.

 

 

정리

우여곡절 끝에 레벨 2 첫 미션의 끝이 보입니다. 내일은 지금까지 배운 어노테이션을 잘 정리해 보면서 위의 3가지 요구 사항을 구현해 보려고 합니다.

댓글

추천 글