우테코

문제 상황 프로젝트를 하면서 우리도 모르게 예외가 터지는 경우가 많아서 실제로 기능에 버그가 있는데 빠르게 캐치하지 못한 적이 많았다. 예외가 발생했을 때 개발자인 우리에게 알려줄 수 있으면 좋겠다고 생각이 들었다. Github 이슈 자동 등록 스모디 팀 슬랙 채널이 존재한다. 프로젝트 깃허브에 PR, Issue 등록, Merge 등의 이벤트가 발생하면 슬랙 채널에 메시지가 오도록 Guthub 앱을 등록한 상태다. Create an Issue POST https://api.github.com/repos/woowacourse-teams/2022-smody/issues Autuorization: token {accessToken} { "title":"이슈 제목", "body":"이슈 바디", "assigne..
새로운 기능 추가에 대한 이야기 스모디 서비스는 사람들에게 동기부여를 해주는 서비스로, 챌린지에 도전하여 인증을 하는 것이 주 콘텐츠이다. 단순한 인증을 넘어, 조금 더 사용자들에게 동기부여를 해주기 위해 랭킹에 관한 기능을 추가하기로 했다. 랭킹 로직을 이벤트로 처리 회원이 챌린지를 인증하면 주간 랭킹 점수에 반영 된다.라는 기능을 추가하려고 한다. 챌린지 인증 → CycleService.increaseProgress() 랭킹 관련 로직 → RankingService 랭킹 로직과 챌린지 로직이 강한 결합을 갖는 것을 막고 랭킹에 장애가 발생해도 챌린지 인증은 정상 동작시키기 위하여 이벤트(@TransactionalEventListener) + 비동기 처리(@Async)를 하기로 선택했다. ( Cycle..
알림 적용기 1편 알림 적용기 2편 이것저것 알아봤으니 이제 프로젝트 코드에 알림 트랜잭션 분리를 적용해 보고자 한다. 챌린지 인증 임박 알림 트랜잭션 분리 테스트 작성 @DisplayName("알림 이벤트에 예외가 발생해도 새로운 사이클은 저장된다.") @Test void cycleCreate_pushEventException() throws InterruptedException { // given LocalDateTime now = LocalDateTime.now(); willThrow(new RuntimeException("알림 로직에 예상치 못한 예외 발생!")) .given(pushEventListener).handle(any(PushEvent.class)); // when Long cycleI..
레벨 4로 접어들면서 톰캣 만들기 미션을 하게 되었는데 제공받은 초기 코드부터가 흥미로웠다. public class Application { private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { log.info("web server start."); final var tomcat = new Tomcat(); tomcat.start(); } } 위 코드만 실행 시켜도 자바 애플리케이션이 꺼지지도 않으면서 localhost:8080으로 오는 요청을 받고 있는 것이 신기해서 소스 코드를 한 번 분석해 보았다. Application { final var ..
POST 요청은 일반적으로 데이터를 body로 보낸다 @PostMapping(value = "/boards/{boardId}", params = "command=move") public ResponseEntity movePiece(@PathVariable int boardId, @RequestBody CommendDto commendDto) { gameService.move(boardId, commendDto); return ResponseEntity.ok(gameService.gameStateAndPieces(boardId)); } 처음에 위와 같이 코드를 짰었다. boardId에 해당하는 체스판을 CommandDto 안의 위치 정보를 통해 체스 말을 움직이는 요청을 처리한다. 그런데 위와 같은 피드백..
IllegalArgumentException vs IllegalStateException @Override public State proceed(Command command) { if (command.isMove()) { throw new IllegalArgumentException(CANNOT_MOVE); } if (command.isStatus()) { throw new IllegalStateException(CANNOT_GENERATE_SCORE); } // ... } IllegalArgumentException과 IllegalStateException을 혼용하여 사용하고 있었고 리뷰어가 이를 지적했다. 각 기능을 만들 때 이 두 예외를 언제 써야 하는지 정확한 기준을 잡지 못했던 것이다. 다음 글..
최상단 directory 하위에 docker directory를 생성 하위에 docker-compose.yml 파일 생성 version: "3.9" services: db: image: mysql:8.0.28 platform: linux/x86_64 restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: practice MYSQL_USER: user MYSQL_PASSWORD: password TZ: Asia/Seoul volumes: - ./db/mysql/data:/var/lib/mysql - ./db/mysql/config:/etc/mysql/conf.d - ./db/mysql/init:/d..
step1 피드백 step2 피드백 함수형 인터페이스의 과용 입력과 출력을 담당하는 View 클래스들을 게임 흐름을 담당하는 컨트롤러에서 분리하고 싶어서 함수형 인터페이스를 사용했었다. 그럼 BlackJackGame을 사용하는 클라이언트인 컨트롤러 입장에서는 드가 매우 깔끔해진다. View의 메서드들을 람다로 함수형 인터페이스로 전달한 결과다. public static void main(String[] args) { BlackJackGame blackJackGame = new BlackJackGame( InputView.askNames(), InputView::askBet, new Deck(Card.getCards())); OutputView.printGamers(blackJackGame.getDeale..
더즈
'우테코' 태그의 글 목록