우아한테크코스/학습 정리
Domain 그리고 Entity, VO에 대한 개인적인 고찰
들어가면서 우테코 레벨 2에 들어와 DB를 프로젝트에 도입하게 된 이래로 지금까지 도메인을 설계하면서, 도메인 객체에서 ID를 갖는 것이 당연하다고 생각해왔다. 여태까지는 이렇다 할 복잡한 비즈니스 로직이 없었고 간단한 검증만을 필요로 할 뿐 기본적인 CRUD 기능 구현이 주된 목표였기에 도메인 설계 시 상태값으로 ID를 가지는 것이 자연스러웠다. 하지만 상대적으로 복잡한 비즈니스 로직을 가지는 지하철 미션을 진행하면서, 도메인 객체에 ID를 부여하는 것에 대해서 다시 한 번 생각하게 되었다. 다음과 같이 노선의 역과 역사이의 구간 정보를 나타내는 Section이라는 객체를 설계하고 ID를 부여했다. public class Section { private final Long id; private fina..
스프링 @Transactional(readOnly=true)에 관한 간단한 고찰
이번 레벨2 미션들을 진행하면서 @Transactional 어노테이션을 별다른 생각 없이 DB 작업을 수행하는 기능들에 대해 선언해왔다. 그러던 중 리뷰어께서 @Transactional 어노테이션의 옵션들 중에서도 readOnly 옵션에 대해 알아보면 좋겠다는 피드백이 있었어서 이에 대해 알아보고자 한다. 일반적으로 검색하면 알 수 있는 내용은 @Transactional(readOnly=true)와 같이 어노테이션 선언 시 옵션을 주게 되면 해당 기능을 수행하는 중 Create, Update, Delete 와 같이 데이터의 변경이 발생하는 작업들이 수행되는 경우 예외를 발생시킨다는 것이다. 실제로 그러한지 알아보기 위해 바로 실험을 해봤다. // 읽기 전용 트랜잭션으로 선언 @Transactional(r..
스프링의 예외처리 과정 및 처리 방법에 대하여 (2)
이전 포스팅에서 이어집니다. 스프링의 예외처리 과정 및 처리 방법에 대하여 (1) 포스팅 배경 우테코 레벨2 두번째 미션인 장바구니 기능 구현을 진행하면서 로그인 인증기능을 구현하기 위해 Interceptor를 구현해서 사용하게 되었다. 이 과정에서 Interceptor 내부에서 예외를 던 makemepositive.tistory.com 스프링이 제공하는 다양한 예외처리 방법 스프링에서는 다양한 예외 처리 전략을 수행하기 위해 HandlerExceptionResolver 인터페이스를 제공한다. public interface HandlerExceptionResolver { @Nullable ModelAndView resolveException( HttpServletRequest request, HttpSe..
스프링의 예외처리 과정 및 처리 방법에 대하여 (1)
포스팅 배경 우테코 레벨2 두번째 미션인 장바구니 기능 구현을 진행하면서 로그인 인증기능을 구현하기 위해 Interceptor를 구현해서 사용하게 되었다. 이 과정에서 Interceptor 내부에서 예외를 던져야할 필요성이 생겼는데 여기서 발생하는 예외는 어떻게 처리해야할지 고민하다 스프링의 전체적인 예외 처리 과정이 궁금해졌다. 스프링에서 예외를 처리하는 전체적인 흐름을 살펴보고 어떻게 미션에서 발생했던 문제를 해결할 수 있었는지 정리해보고자 한다. 우리가 직접 구현한 Controller에서 발생하는 Exception들은 어떻게 처리될까? Spring은 기본적인 에러 처리를 위한 BasicErrorController를 구현해뒀다. 이로 인해 별도의 추가 설정이 없다면 스프링 부트는 예외가 발생했을 때 ..
[Level 2] Layered Architecture에 대한 개인적인 고찰
자바 콘솔 기반 프로그램을 구현하던 레벨1에서 웹 기반 프로그램을 구현하는 레벨2로 넘어오면서 Layered Architecture를 계속 접하게 되었다. 인터넷을 조금만 찾아봐도 Layered Architecture의 각 계층들이 어떤 책임을 지는지에 대해 설명하는 글들을 쉽게 접할 수 있다. 그러나 미션을 진행하면서 궁금했던 것은 Layered Architecture로 설계된 프로그램에서 각 계층들이 어떻게 정보를 주고 받게 할 것인가였다. 레벨1에서 MVC 구조를 사용하며 VIew와 Model이 상호 독립적으로 최대한 의존하지 않도록 해야했고 그 완충 작용을 해주는 역할이 Controller였다. 그런데 Layered Architecture로 설계된 웹 프로젝트에서 각 계층들은 왜 분리해야 하는지,..
[Level 2] Repository와 Dao를 분리하는 기준
본 포스팅은 우아한테크코스 레벨2 웹 자동차 경주 미션을 진행하며 고민했던 내용 중 일부를 정리한 것입니다. 개인의 주관이 들어간 글인지라 틀린 내용이 있을 수 있음을 미리 말씀드립니다. 처음에는 단순하게 Repository가 Dao들을 사용해서 기능을 수행하면 된다고만 생각했다. 아래는 미션에서 구현했던 웹 기반 자동차 경주 프로그램의 Repository 클래스이다. 코드를 살펴보면 Repository는 자동차 경주 게임을 진행한 결과 정보를 담은 Dto를 넘겨받아 저장하는 save 기능만을 수행한다. @Repository public class WebRacingCarRepository implements RacingCarRepository { private final RacingGameDao raci..
[Level 2] 공식문서를 통한 프레임워크 학습 방법에 대한 고찰
우아한테크코스 레벨2에서는 스프링 프레임워크에 대한 학습을 진행하게 된다. 하지만 첫날 OT를 듣고 나니 개인적으로 스프링 자체보다는 처음 접하는 기술에 대해 학습하는 방법을 찾으려고 노력해야 한다는 것이 핵심이라고 느껴졌다. 생각해보면 아무리 지금 스프링을 열심히 공부해둔다고 해도 현업에 가서는 전혀 다른 기술을 사용하게 될 가능성이 더 높았다. 그럴 때 결국 도움이 되는 본질적인 스킬은 신기술을 올바르게 사용하는 방법을 빠르게 학습하는 것이라는 생각이 들었다. 그래서 개인적인 레벨2 목표를 신기술을 접했을 때 학습하는 방법을 찾고 연습하는 것으로 결정했다. (물론 스프링 자체에 대한 학습도 빼먹지 말자...!) 첫 번째 미션을 진행하는 중 Spring JDBC에 대한 학습 테스트를 진행하게 되었다. ..
[Level 1] 인터페이스와 추상클래스에 대한 개인적인 고찰
블랙잭 미션에서 상태 패턴을 적용하려고 시도 하면서 인터페이스와 추상클래스를 모두 사용하게 되었다. 미션을 진행할 때 당시에는 다형성에 대한 개념도 잘 모르면서 무작정 인터페이스와 추상클래스를 사용했었는데 각각에 대해 공부해보고 언제 사용해야 하는지 개인적인 기준을 정립해보고자 했다. 해당 포스팅은 인터페이스와 추상클래스에 대한 개인적인 생각을 정리한 것이지 정답이 아니기에 틀린 내용이 있을 수 있습니다. 😂 인터페이스에 대한 특징들을 간단하게 정리하면 다음과 같다. 인터페이스는 모든 메서드가 추상 메서드로 선언된다. 미리 사용할 메서드를 인터페이스에 선언해두고 구현 시 선언된 추상 메서드들을 구현하면 된다. 이는 자식 클래스에게 구현을 강제시켜 구현 객체의 동일 동작을 보장한다고 볼 수 있다. 상속보다..