본문 바로가기

Spring Framework7

[Spring/Testing] 단언문에 에러 메시지 포함하기 테스트 코드를 작성할 때, 흔히 아래와 같이 단언문(assertion)을 작성한다. assertThat(owner.getLastName()).isEqualTo(newLastName); owner의 실제(actual) lastName이 newLastName과 같으면 아무 일도 일어나지 않으면서 테스트가 성공하고, 값이 다르다면 빨간 막대가 뜨면서 테스트가 실패할 것이다. 물론 이렇게만 작성해도 테스트가 실패한 이유를 테스트 러너가 제공하기는 한다. "어떤 값을 expect했는데, 실제로는 이런 값이 나왔다"라면서... 하지만 사람이 읽고 좀 더 이해하기 쉽도록 메시지를 넣어준다면 더 좋을 것이다. 《JUnit in Action》에서는 "assert 메서드를 호출할 때는 에러 메시지도 무조건 함께 기입하는 .. 2020. 4. 5.
Spring MVC — HandlerMethodArgumentResolver 사용하기 Spring MVC의 Controller에서 parameter를 받을 때 흔히 다음과 같이 한다. @GetMapping(path = "user/{userId}/post/list") public ApiResult posts( ... @RequestParam("offset") int offset, @RequestParam("limit") int limit) { ... return new ApiResult(...); } @RequestParam을 통해 URL 상의 매개변수를 직접 받아 사용하는 모습이다. 위와 동일한 방법으로, 더 많은 수의 값들을 받을 수도 있다. @GetMapping(path = "user/{userId}/post/list") public ApiResult posts( ... @Reques.. 2019. 5. 3.
@Transactional의 noRollbackFor 속성 대개 Service layer에서, @Transactional 애노테이션을 붙여서 특정 메소드의 작업을 하나의 트랜잭션으로 처리하도록 할 수 있다. 이 때 한 @Transactional 메소드 내부에서 또 다른 @Transactional 메소드를 호출하면, 호출된(callee) 트랜잭션은 호출한(caller) 트랜잭션에 병합된다. 또한 호출된 트랜잭션을 수행하다가 에러가 발생했을 경우, 기본적으로 트랜잭션이 모두 rollback 처리 된다. 때에 따라서는 특정 트랜잭션은 rollback이 일어나지 않도록 하고 싶을 수도 있는데, 이 때 @Transactional의 'noRollbackFor' 라는 속성을 사용할 수 있다. 사용하는 방식은 다음과 같다. @Transactional(noRollbackFor .. 2019. 5. 2.
Validation(입력값 검증)의 최적의 장소는 어디일까? 일반적인 3-Tier 구조로 웹 애플리케이션을 만든다고 가정할 때, Controller - Service - Repository 모두에서 입력값 검증(Validation)을 수행할 수 있다. Controller에서 @Valid annotation을 사용한다던지.. 그런 것들 말이다. 그렇게 해도 문제는 없다. 그러나 각 계층에서의 검증 코드는 사실 비슷비슷한데, 그 비슷한 코드들을 모든 계층에 위치시키는 것은 생산성 측면에서 불편하기도 하고, 오류 발생 가능성도 높아진다. 사실 입력값에는 아무 문제가 없는 상황이었는데, 검증 코드 어딘가에서 잘못 작성한 코드가 있어서 오류가 발생한 것임을 알게 된다면 짜증나지 않겠는가? 그리고 비슷한 작업을 모든 계층에서 여러번 수행하니 성능 측면에서도 손해보는 부분이 .. 2019. 4. 25.
IoC / DI DI란 Dependency Injection의 약자로, IoC라는 원칙을 구현하기 위한 일종의 패턴이라고 볼 수 있다. 그렇다면 IoC란 무엇일까? IoC IoC란 Inversion of Control의 약자로, 객체를 생성하고 객체 간의 의존 관계를 맺어주는 등의 작업을 프레임워크가 대신 해준다는 것이다. 관련된 metadata(설정 정보)를 만들어 놓으면, 그것을 기반으로 Spring Container(혹은 IoC Container), 혹은 프레임워크가 해당 작업을 대신한다는 원칙이다. 개발자가 직접 객체를 생성하고 의존 관계를 맺어줄 필요가 없다. 전통적인 프로그래밍에서는, 개발자가 작성한 코드에서 → 라이브러리를 호출했다면, IoC는 프로그램의 흐름을 프레임워크가 제어하고, 프레임워크에서 → 개발.. 2019. 3. 7.
Spring MVC 동작원리 / 구성요소 Spring MVC의 동작 원리1. DispatcherServlet이 브라우저로부터 요청을 받는다. 2. DispatcherServlet은 요청된 URL을 HandlerMapping 객체에 넘기고, 호출해야 할 Controller 메소드(핸들러) 정보를 얻는다. 3. DispatcherServlet이 HandlerAdapter 객체를 가져온다. 4. HandlerAdapter 객체의 메소드를 실행한다. ※ 보다 정확하게 표현한다면, HandlerMapping은 DispatcherServlet로부터 전달된 URL을 바탕으로 HandlerAdapter 객체를 포함하는 HandlerExecutionChain 객체를 생성하며, 이후 DispatcherServlet이 HandlerExecutionChain 객체로.. 2019. 3. 7.
Spring Boot / JSP jstl 관련 에러 (An invalid XML character 등) Spring Boot로 간단한 survey 페이지를 만들고 있는데, 원인을 알 수 없는 이상한 에러가 발생하고 있다. pom.xml 4.0.0 com.-----(생략)----- -----(생략)----- 0.0.1-SNAPSHOT jar -----(생략)----- -----(생략)----- org.springframework.boot spring-boot-starter-parent 2.1.0.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime mysql mysql-connector-java runtime org.springframe.. 2018. 11. 27.