Software Backend

    Spring Request 데이터를 List 형태로 받으면 @Valid 체크가 안되는 현상 해결 방법

    Spring Request 데이터를 List 형태로 받으면 @Valid 체크가 안되는 현상 해결 방법

    Spring does not check valid when list data is databinding 다음과 같은 예시가 있습니다. 스프링에서 Controller 로 데이터가 넘어올 때 [java.util.List] 형태의 데이터만 넘어와서 해당 List에 맞게 DTO를 만들어서 List로 데이터를 받는데, List 안의 데이터에 대해서 분명히 조건 체크를 하게 했는데 Null로 데이터가 넘어온 데이터로 작업하게 되어 에러가 발생한다 ????? 위 문제로 인해 저도 여러 해결 방법을 찾아봤는데요 특히, "Custom Validator를 만들어서 체크하면 된다" 하는 글이 대부분이었습니다. 위 Custom Validator가 아닌 방법으로 좀 더 손쉽게 해결 가능하도록 해봅시다. 우선 이유부터 알아봅시다..

    협업을 위한 snake_case -> camelCase 변환 방법 @JsonNaming, @JsonProperty

    협업을 위한 snake_case -> camelCase 변환 방법 @JsonNaming, @JsonProperty

    협업 도중 발생한 문제로 시도한 JsonNaming과 JsonProperty 문제가 발생한 이유는 다음과 같다. Front-End에서는 이미 많은 부분을 snake_case를 사용하고 있었기에 변경소요가 너무 커서 계속해서 snake_case를 사용하기 원했다. Back-End 개발자인 나는 Java 작성 규칙에 따라 camelCase로 작성하길 원했다. 그렇기 때문에 Front-End에서는 snake_case로 데이터를 보냈고, snake_case로 데이터를 받았다. 두 가지의 요구사항을 만족하기 위해 어떻게 해결할까? 생각을 하며 여러가지 방법을 시도해 보았는데, 결과물은 같지만 불필요한 코드가 많이 발생하게 되는 과정이 많이 생겼다. 이러한 문제해결 도중 @JsonNaming과 @JsonProper..

    객체 지향, 오브젝트와 의존 관계의 이해

    Connection을 통한 오브젝트와 의존관계의 이해 public class UserDao { public void add(User user) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.cj.jdbc.Driver"); Connection c = DriverManager.getConnection( "jdbc:mysql://localhost/springbook","spring","book"); PreparedStatement ps = c.prepareStatement( "insert into users(id, name, password) values(?, ?, ?)"); ps.setString(1, user.getId());..

    에러, java.lang.IllegalStateException: stream has already been operated upon or closed

    에러, java.lang.IllegalStateException: stream has already been operated upon or closed

    문제 스트림으로 백준 알고리즘 연습 도중 발생, 코드는 다음과 같다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.OptionalInt; import java.util.stream.Stream; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(..

    API 명세서 뜯어보기 - StringTokenizer Class

    Package java.lang.Object java.util.StringTokenizer What is StringTokenizer The string tokenizer class allows an application to break a string into tokens. The tokenization method is much simpler than the one used by the StreamTokenizer class. The StringTokenizer methods do not distinguish among identifiers, numbers, and quoted strings, nor do they recognize and skip comments. 문자열 토크나이저 클래스를 사용하면..

    Mock && Mockito : 가짜 객체

    Mock 객체란? 실제 객체를 만들기 위해서는 비용과 시간이 많이 들기 때문에, 비용이 적게 들도록 가짜 객체를 생성하여 사용하는데 이것이 Mock 객체이다. 일반적으로 테스트 더블은 상태(State)를 기반으로 테스트 케이스를 작성하는데 Mock 객체는 행위(behavior)를 기반으로 테스트 케이스를 작성한다 테스트 더블이란? 실제 객체를 사용하지 않고 이를 대신해줄 가짜 객체를 만들어 테스트 수행을 하는 방법 상태기반 특정한 메소드를 거친 후 객체의 상태에 대해 예상값을 비교 가장 보통의 예 : setName("test") → assertThat( "test", is(getName() ); 행위기반 메소드 리턴값이 없는 void 이거나, 예상된 동작을 보장할 수 없을때 시나리오를 기반으로 A가 입력..

    JUnit : 자바에서 사용하는 가장 대표적인 단위 테스트 프레임 워크

    JUnit : 자바에서 사용하는 가장 대표적인 단위 테스트 프레임 워크

    JUnit TDD 사이클을 진행하는데 도움을 주는, Java에서 사용하는 가장 대표적인 단위 테스트 프레임 워크이다. 테스트 결과가 예상과 같은지를 판별해주는 단정문(assertions) 여러 테스트에서 공용으로 사용할 수 있는 테스트 픽스처(test fixture) 일관된 테스트 실행환경 테스트 작업을 수행할 수 있게 해주는 테스트 러너(test runner) JUnit의 단정문 assertEquals : 두 값이 같은지 비교 assertSame : 두 객체가 동일한 객체인가 주소 값으로 비교 assertNotSame : 두 객체가 동일하지 않은 객체인가 주소 값으로 비교 assertTrue : 값이 참인지 비교 assertFalse : 값이 거짓인지 비교 assertNull : 값이 null 인지 비..

    TDD : 테스트 주도 개발

    TDD : 테스트 주도 개발

    TDD : 테스트 주도 개발 What is TDD (Test Driven Development)? TDD의 정의는 다음과 같다. Test the Program before you write it. ( 프로그램을 작성하기 전에 테스트 먼저 해라 ) by 켄트 백 "업무 코드를 작성하기 전에 테스트 코드를 먼저 만드는 것" 고전적인 개발 방법의 문제점 특정 모듈의 개발 기간이 길어질수록 개발자의 목표의식이 흐려진다 작업 분량이 늘어날수록 확인이 어려워진다 개발자의 집중력이 필요해진다 논리적인 오류를 찾기가 어렵다 코드의 사용 방법과 변경 이력을 개발자의 기억력에 의존하게 되는 경우가 많다 테스트 케이스가 적혀 있는 엑셀 파일을 보며 매번 테스트를 실행하는 게 점점 귀찮아져서는 점차 간소화하는 항목들이 늘어난..