반응형

JAVA/JAVA | Spring 학습기록 72

[ERROR] Required request body is missing 해결

Required request body is missing 이 에러를 본 적 있는가? 해석해보자면 요청의 body에 존재해야될 것이 존재하지 않는다는 것이다. 보통 400 Bad Request, 415 Unsupported Media Type 에러와 함께 발생할 확률이 높다. 해당 api를 사용할 때 요청에 들어있는 객체를 이용해서 처리하는데, 정작 요청 body에 값이 없는 것이다. 주로 POST, PUT http method API를 사용할 때 많이 발생한다. 해결 방법은 어떻게 될까? 1. (가장 높은 확률로) 요청 body에 담긴 값이 JSON이 아닐 때 400 Bad Request, 415 Unsupported Media Type 에러와 함께 postman을 이용하여 간접적으로 api 호출을 할..

[ERROR] Request method 'GET' not supported 해결

Request method 'GET' not supported 뿐만 아니라 Request method 'GET' not supported, Request method 'PUT' not supported 등등. Request method '{HTTP method}' not supported 관련 에러가 뜰 때 해당되는 포스팅이다. 보통 405 Method Not Allowed, 500 Internal Server Error와 함께 발생할 확률이 높다. 나의 경우는 특정 기능을 수행하거나 테스트할 때 위 문구와 함께 500 에러가 발생했다. 원래대로라면 body에 원하는 객체의 속성들이 담겨있어야 한다. 하지만 결과는? com.fasterxml.jackson.databind.exc.UnrecognizedPr..

[Spring][TDD] RestAssured를 이용한 e2e test로 Controller API까지 통합 테스트해보자

그동안 나는 단위 테스트만을 진행해왔다. 도메인 로직이 잘 실행되는지 junit 문법의 Assertions로 테스트해왔다. dao test는 @JdbcTest를 이용하여 단위테스트를 했고, service test는 fake 객체를 만들어주어 단위 테스트를 진행해주었다. 그런데 컨트롤러는 @RestController에서 @RequestBody로 request를 받고, ResponseEntity를 넘겨주기 때문에 웹 애플리케이션을 직접 실행하면서 테스트하지 않는 이상, 어떻게 테스트해야할지 감이 오지 않았다. RestAssured를 이용하면 API response의 statusCode뿐만 아니라 body에 올바른 값이 담기는지도 테스트가 가능하다! 이번 시간에는 Spring 환경에서의 RestAssured를..

[Spring] @Transactional로 DB 동시성 문제를 방지하자

웹 데이터 애플리케이션을 만들 때, dao에서 sql문으로 db에 접근하고 service에서 dao 메서드들을 이용하여 하나의 트랜잭션을 관리한다. 그런데 만약 이 애플리케이션을 여러 명이서 동시에 사용한다면? 동시성 문제가 발생할 수 있다. 동시성 문제란, 두 개 이상의 세션이 공통된 자원을 읽고 쓸 때 발생할 수 있는 문제를 의미한다. 이번 포스팅에선 이러한 동시성 문제와 트랜잭션에 대해서 알아보고, @Transactional 어노테이션으로 해결하는 방법을 알아볼 것이다. +) 22.10.13. 트랜잭션 격리레벨 설명 수정 및 보충 트랜잭션이란? DBMS에서 데이터를 다루는 작업의 단위를 의미한다. 용어상 정의로는 이해하기 어렵지만, 트랜잭션의 성질을 알아보면 보다 더 쉽게 이해할 수 있을 것이다. ..

[ERROR] GroovyRuntimeException: Conflicting module versions. (feat. java.lang.ExceptionInInitializerError)

문제 상황 스프링 환경에서 jdbcTemplate을 이용하여 애플리케이션을 생성하고 있었다. 그러던 도중, dao test코드에서 아래와 같은 에러가 발생했다. 웃긴 건, 애플리케이션 실행 자체는 정말 잘 된다는 점이다. groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-xml is loaded in version 4.0.1 and you are trying to load version 3.0.10 dao 테스트 코드에서만 위 에러가 뜨면서 실패한다. 문제 원인 build.gradle의 rest-assured 버전이 문제였다. testImplementation 'io.rest-assured:rest-assured..

[ERROR] 406 에러 _ Not Acceptable (스프링 직렬화/역직렬화)

문제 상황 스프링 환경에서 특정 dto 를 반환해주는 api에서 406 에러가 발생했다. @GetMapping("/status") public ResponseEntity status() { return ResponseEntity.ok(chessService.getStatus()); } 뿐만 아니라, 응답으로 MoveDto를 받아서 작동하는 move api도 아예 작동하지 않았다. @PostMapping("/move") public ResponseEntity move(@RequestBody MoveDto moveDto) { System.out.println(moveDto); return ResponseEntity.ok(chessService.move(moveDto)); } MoveDto를 요청으로 받아서 ..

[호호 스터디] DI와 서비스 로케이터 _객체지향과 디자인 패턴 Chapter 6

호호 스터디에서 Chapter 6: DI와 서비스 로케이터를 듣기 전에, 미리 책을 읽고 공부한 내용을 기록한 포스팅이다. DI와 서비스 로케이터 각 객체들을 사용하기 위해선 어떤 방법이 좋을까? 아무 생각없이 객체를 생성하고 의존하게 될 경우, Chapter 5에서 배웠던 DIP(의존 역전 원칙), OCP(개방 폐쇄 원칙), SRP(단일 책임 원칙) 등 SOLID 원칙을 어기게 되고, 변경에 유연하지 못한 코드가 만들어질 확률이 높다. 특히, 순환 의존이 발생할 경우, 요구사항이 수정되거나 변경될 경우 모든 객체의 코드를 수정해야 될 수도 있다. 이번 시간에는 DI(Dependency Injection), 서비스 로케이터를 이용한 객체 사용 방법에 대해 알아보도록 하겠다. Service Locator ..

[호호 스터디] 설계 원칙: SOLID_객체지향과 디자인 패턴 Chapter 5

호호 스터디에서 Chapter 5: 설계 원칙: SOLID를 듣기 전에, 미리 책을 읽고 공부한 내용을 기록한 포스팅이다. SOLID 원칙 어떻게 보면 귀에 딱지가 앉을 정도로 많이 들어서 너무 뻔하게 느껴질 수 있다. 하지만 막상 코드를 짤 때는 자신도 모르는 사이에 잘 지켜지지 않는 경우가 많다. 애초에, 객체의 값을 꺼내지 말고 메시지를 던지라는 것조차도 코드를 짜다보면 잘 안지켜지는 경우가 많은 것처럼 말이다. 이번 포스팅에서 SOLID 원칙을 살펴보긴 하겠지만, 제일 좋은 건 실전을 통한 많은 경험을 해보는 것인 듯하다 :) 단일 책임 원칙 (Single Responsibility Principle : SRP) 클래스는 단 한 개의 책임을 가져야 한다. 객체지향적인 코드를 짜기 위해 최대한 책임..

[JAVA] VO(Value Object)로 원시값을 포장해보자

VO(Value Object)란, 도메인에서 속성들을 묶어서 값을 나타내는 객체이다. 사실 나는 VO에 대해서 단순하게 "도메인 중에서 가장 기본이 되는 객체" 정도로만 알고 있었는데, 이번에 우아한테크코스 미션을 진행하면서 VO 개념을 정립할 수 있었다. VO란 무엇일까? 사실 VO의 개념에 대해선 이 글이 정말 잘 정리가 돼있다. https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/ VO(Value Ojbect)란 무엇일까? 프로그래밍을 하다 보면 VO라는 이야기를 종종 듣게 된다. VO와 함께 언급되는 개념으로는 Entity, DTO등이 있다. 그리고 더 나아가서는 도메인 주도 설계까지도 함께 언급된다. 이 글에서는 우선 다 tecoble...

[JAVA] Cache를 이용한 재사용으로 성능을 높이자

Cache(캐시)란, 자주 사용하는 데이터를 복사해놓은 임시 장소를 의미한다. 알고리즘에서 Dynamic Programming (DP)를 공부했다면 이해하기 수월할 수 있다. 나는 Cache를 이용하여 성능을 높이는 방법을 알고리즘 문제풀이에서만 사용해왔고, 실제 JAVA 개발에선 사용해본 적이 거의 없었는데, 이번에 우아한테크코스 미션을 통해서 캐싱을 할 기회가 생겨서 기록해보려 한다! 블랙잭 미션에서 캐싱이 필요한 이유 블랙잭 룰을 알고 있는가? 딜러와 플레이어들이 카드 (2~10, J, K, Q, A)를 가지고 카드들의 점수 합과 카드 개수로 승부를 겨루는 게임이다. 블랙잭에서의 카드 개수는 총 52개 (4개의 문양 * 13개의 숫자/알파벳)으로 이루어져 있으며, 참가자들은 이 카드들을 랜덤으로 나..

반응형