티스토리 뷰

6,7,8주차 미션 : 체스 게임 with Console/Web UI

https://github.com/woowacourse/java-chess

  • 이번주 빌런 : Pawn
  • 웹/DB는 역시 욕심을 버리고 부담없이 대충 만들었고, 비즈니스 체스 코드는 중간에 폰때문에 한번 갈아엎긴했지만 나름일단 완성은 됬다. 폰빼고 거의다 완성했는데 폰 규칙이 너무 복잡해서 구조가 다 바뀌어야하는 상황이 초래되어, 갈아엎고 이번엔 폰을 제일먼저 완성시킴.
  • DB는 DAO의 중복을 JDBCTemplate으로 추출하니 훨씬 깔끔해져 마음 편안하고 재밌었다.
  • 서비스, DAO, JDBCTemplate 모두 상태를 없애고 singleton으로 만들어보았다.
  • 싱글턴과 static 클래스의 차이에 대해서도 고민해보았고, 레이어 아키텍쳐에 대해서 이제 1%정도는 알게된 느낌이다. 다음레벨가면 차차 알게되겠지.
  • 시간의 제약으로 크루모두 전반적으로 피드백을 충분히 받진못했지만, 고생한 레벨1 마무리에 의미를 부여하며 다음레벨도 열심히 해보기로. (따라서 대부분의 피드백과 공부를 다음레벨로 넘기고있다.....)

내 코드 피드백

인텔리제이에서도 directory - 우클릭 - diagram 으로 간단히 클래스 다이어그램을 얻어낼수있다는 사실 ! 인텔리제이 DB기능에 이어 무척 유용할것같다.

"Column index out of range" 에러
JDBCTemplate 클래스에서 select문의 결과로 가져온 ResultSet을 파싱할때
칼럼의 인덱스가 1부터 증가하는데, 습관적으로 0으로 코딩하여 삽질

■ Pobi 수업 - Dependency Injection, 인터페이스 분리 연습
code : java-chess / pobi branch
https://github.com/os94/java-chess/commits/pobi
Car.move()의 랜덤성을 MoveStrategy 인터페이스로 분리하는 연습
Chess의 board.initialize()도 마찬가지로 인터페이스로 분리해 주입하는 연습
=> 테스트하기 편해지고, 훨씬 유연해진다.
=> DI의 필요성을 느끼라
"DI를 적용하면 런타임에 의존관계를 결정할 수 있기 때문에, 변화에 빠르게 대응할 수 있다."
정리 : Dependency Injection (basic)
ㄴ 본 강의내용을 체스구현에도 적용시킬 수 있었다.

지난주 로또 미션을 진행하며, 위의 세 자원에 대한 close를 어디서 해야할지 고민했었다.
try-with-resources 구문을 활용하니 이에대한 고민을 해결할 수 있었다.
How should I use try-with-resources with JDBC?

JDBCTemplate도 적용해보길 잘했다.
인자를 받지않는 메서드를 오버로딩하고, 여러인자를 받는경우는 리스트로 받는 다른 크루들의 코드가 많았는데
이렇게 가변인자를 활용하니 참 편했다. 전후의 리스트 처리도 안해도 되고.

Point가 x,y값을 갖는 이차원 개념이다 보니, 컬렉션안에 컬렉션을 갖도록 복잡한 구조를 고민하고있었는데
지금 상황에서는 저렇게 String정도로 정리하는것도 괜찮은것 같다. 페어의 도움 :)

전반적으로 이번 미션은 시간이 부족해,
도메인기능 겨우 완성시키고 부랴부랴 제출하면서 세세하게 신경쓰진 못했다.

그와중에도 몇가지 새롭게 시도해보긴 했는데
지난주 로또미션부터 답답하고 감 못잡았던 DAO 중복을 JDBCTemplate으로 빼는 과정이 재밌었다.
(물론 스프링가면 또 달라지겠지만,,)

try-with-resources를 적용한것도 좋았고, 쿼리를 batch로 보내는건 일단 시도는 해보았으나 관련 코드가 다소 더럽다. 역시 차차 알게 될듯.

dao와 service 등을 싱글턴으로 바꿔보기도 했다. 레이어 아키텍쳐는 점차 알아가야할듯.

다른 사람들의 피드백

DB관련 코드 테스트는 잘 감이 오지 않는다. 다음레벨 ㄱ

// Todo : RowMapper
JDBCTemplate 적용할때 같이 해보려했는데, 다소 어려워서 보류. 다음엔 할수있겠지?
https://github.com/woowacourse/java-chess/pull/18#discussion_r297983655
https://github.com/woowacourse/java-chess/pull/36#discussion_r298263671

무조건 boolean보단 String도 괜찮을 것 같다.

EffectiveJava 참고해보자

예외를 잡았을때 어떻게 해야할지도, 나중에 한번 제대로 고민해봐야겠다.

Toby spring - 사라진 SQLException

강력한 자바 오픈소스 로깅 프레임워크, logback 사용법 with example(스프링 부트에서 logback 가이드, logback-spring.xml 설정하기)

다른 사람들의 피드백에서 꾸준히 보이는 부분

https://octoperf.com/blog/2016/10/27/impl-classes-are-evil/
관례적으로 ServiceImpl을 만들거나 @ Impl suffix는 좋지않다. 안티패턴 !

// Todo : DAO vs Repository
What is the difference between DAO and Repository patterns?

Optional도 슬슬 등장
자바8 Optional 2부: null을 대하는 새로운 방법

참고할만한 피드백들 !!

나는 Piece가 type을 갖고있지않아서 isPieceOf같은 메서드는 만들 수 없었다.
하지만, 여전히 isPawn, isKing같은 메서드가 확장에 안좋은건 사실이다.
대체방안으로 일단 임시방편으로 score필드를 이용해 비교를 해볼수도 있었고
https://github.com/woowacourse/java-chess/pull/44/files/e6a8b243068fea1a876d243bfca5e48cf9b6a7f4#r298144928
이렇게 Type이라는 인자로 Class자체를 받아버려서 비교하는 방법도 있었다. 이 방법은 적절한 건지는 아직 잘 모르겠지만, 일단 이런 방법이 존재한다는 것만 알고있자.

빌더 패턴도 심심찮게 보이고 흥미가 간다. 한번 공부해봐야겠다.

급하게 짜긴했는데, 내 서비스 코드도 참 문제가 많다.

// Todo
이번 내 코드처럼 try-with-resources를 활용하면, 매번 connection을 생성하고 닫는다.
위의 피드백처럼 싱글턴으로 연결을 유지하는 방식과 머가 더 나을까? 고민해봐야겠다.

  • 관련해서 주의할점. singleton환경에서 connection이 클래스/인스턴스 변수면 멀티스레드 환경에서 문제가 될 수 있다. 따라서 이때는 각 메서드의 로컬변수로 구현해야 한다 !!

모두 대문자 대신 Dto/Dao와 같이 써보자

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함