서비스 단의 @Transactional 관리와 코드 리팩토링최근 프로젝트에서 일정 관리 서비스를 구현하며 @Transactional을 사용한 코드 개선을 진행했습니다. 처음에는 전체 클래스에 @Transactional을 적용했지만, DB 로직이 단순한 메서드도 많아 필요하지 않은 경우가 많다는 것을 깨달았습니다. 특히 findById 메서드는 단순히 ID로 조회하는 작업이었기 때문에 트랜잭션이 필요하지 않았습니다. 이러한 점을 인지하고, @Transactional을 적절히 사용하는 습관을 기르기로 했습니다. 수정된 코드리팩토링 한 코드는 다음과 같습니다.@Service@RequiredArgsConstructorpublic class ScheduleService { // ...... @Trans..
Field 'name' doesn't have a default value 오류과제를 진행하던 중 name 필드에 값이 없다는 오류 메시지를 마주쳤습니다. Writer 테이블이 생성되기 전 name 필드를 통해 사용자 정보를 구별하고자 했으나, 동명이인 문제로 Writer 테이블을 만들게 되었습니다. 그러나 기존에 JPA를 사용하면서 Entity에서 삭제만 시켜두면 적용되었던 것에 익숙해져서 그런지 Schedule.sql에서 name을 삭제하지 않아 NOT NULL 제약으로 인해 오류가 발생했습니다. 이를 통해 데이터베이스 구조 변경 시 관련 필드와 로직을 함께 검토해야 한다는 교훈을 얻었습니다. scheduleRepository에서 Writer 객체 사용다음으로, scheduleRepository에서 ..
숫자 야구 게임 과제가 끝나고 제 프로젝트를 돌아보며 잘한 점과 못한 점에 대한 회고를 하려고 합니다.잘한 점통일된 예외 처리BaseballException을 상속받는 다양한 예외 처리를 통해 통일감 있고 규칙적인 예외 처리를 구현했습니다. 무질서하게 흩어져 있을 수 있는 예외 상황을 하나의 규칙 아래 묶음으로써, 예외 처리 코드의 가독성과 유지보수성을 크게 높일 수 있었습니다.개인 과제였지만, 이러한 일관성 있는 처리 방식은 협업 시에 큰 장점으로 작용할 것입니다. 향후에는 다양한 예외 상황을 다루면서 예외 메시지와 상태 코드를 정의하여 더 정교한 예외 처리를 시도해 볼 계획입니다. 메서드 파라미터에 final메서드 파라미터에 final 키워드를 사용하면서, 불변성을 보장할 뿐만 아니라 휴먼 에러를 예..
새로운 클래스에 대한 고민과 결정Lv4에 들어서면서 자릿수에 대한 요구 사항이 있었다. 이에 따라 GameManager에서 필드로 digitSize를 가지고 있게 생각을 하였는데, 좀 더 객체 지향적으로 개선하기 위해 책임의 분리와 확장성을 고려하며 이에 따라 개선한 과정을 작성하려고 한다. 고민의 코드public class GameManager { private final BaseballGame baseballGame; private final GameStats gameStats; private final int digitSize; public GameManager() { this.gameStats = new GameStats(); this.base..
GameManager 설계 고민과 해결계산기 과제 Level 2, Level3에서는 GameManager 클래스가 게임의 전반적인 흐름을 제어하고 사용자 입력에 따라 게임을 시작하거나 기록을 조회하는 역할을 한다. 이 과정에서 몇 가지 설계 고민이 있었고, 그에 대한 해결책을 마련하였다. 이번 포스트에서는 이 고민과 해결책에 대해 자세히 살펴보겠다. 고민 1: GameManager 생성 시 BaseballGame 인스턴스 초기화public class BaseballGame { private final NumberGenerator numberGenerator; private final Referee referee; public BaseballGame(final NumberGenera..
이번 계산기 프로젝트에서 발생한 문제와 그 해결 방법을 정리하려고 한다.문제 상황ArithmeticCalculator 객체를 매번 새로 생성할 때, 계산 결과가 results 리스트에 저장되지 않는 문제가 발생했다. 이는 매번 객체가 새로 생성되면서, 결과가 저장되지 않고 사라지는 상황이었다.public void start() { while (true) { ... ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator(firstNumber, secondNumber, operation); Number answer = arithmeticCalculator.calculate(); ..