java

    [Spring] ObjectMapper -> Jackson2ObjectMapperBuilder vs 생성자

    1. 기본생성자가 없는 객체에 대한 역직렬화 차이여기 객체 1개가 있다.@Getter@AllArgsConstructorpublic class TestDto { private String id;} 기본생성자가 없는 객체를 만들었다. 직렬화/역직렬화 테스트를 해보자.@RestControllerpublic class TestController { @GetMapping public TestDto test(@RequestBody TestDto dto) { return dto; }}// input{ "id": "1"}// output{ "id": "1"}문제 없이 성공한다. 성공하는 이유는 JacksonHttpMessageConvertersConfiguration 클래스..

    [Spring] jackson 역직렬화, 필드가 1개일 때 HttpMessageNotReadableException

    jackson 2.17 문제 상황개발환경java 21spring 3.3.0jackson 2.17.1 다음과 같은 java 코드가 있다.@RestControllerpublic class TestController { @GetMapping public TestDto test(@RequestBody TestDto dto) { return dto; }}@Getter@AllArgsConstructorpublic class TestDto { private String id;} 1. TestDto는 필드가 1개 & 기본 생성자 없이 전체 생성자만 갖고 있다.2. 컨트롤러에서는 필드가 1개인 TestDto를 @RequestBody로 역직렬화해야 한다. HttpMessageNotRead..

    [Spring] Pointcut 유형에 따라 Proxy 생성 방식이 달라진다? (CGLIB or JDK Proxy)

    [Spring] Pointcut 유형에 따라 Proxy 생성 방식이 달라진다? (CGLIB or JDK Proxy)

    "토비의 스프링 3.1 Vol.1 > 6.5.3 포인트컷 표현식을 이용한 포인트컷"을 공부하면서 배운 부분을 기록. 여기 프록시 관련 빈 설정 파일이 있다.@Configurationclass BeanConfig { @Bean fun userService(): UserService = UserServiceImpl(userLevelUpgradePolicy(), userDao()) @Bean fun defaultAdvisorAutoProxyCreator(): DefaultAdvisorAutoProxyCreator = DefaultAdvisorAutoProxyCreator() @Bean fun transactionAdvisor(): DefaultPointcutAdvisor = ..

    [Spring] junit test에서 lombok 사용하는 방법

    만약 lombok을 junit test에서 사용할 수 없다면?build.gradle 파일에 다음 조건이 추가됐는지 확인해보자.dependencies { compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") ... // Lombok을 테스트 환경에서도 사용하기 위한 추가 설정 testCompileOnly("org.projectlombok:lombok") testAnnotationProcessor("org.projectlombok:lombok")}-> Lombok의 애노테이션 프로세서가 테스트 코드에서도 동작하게 하자.

    [JPA] drop table if exists user cascade " via JDBC

    -> User 엔티티 클래스를 ddl-auto: create로 자동 DDL 생성을 하면 발생하는 오류 메시지다.-> h2에서 "user"라는 키워드가 예약어라서 그렇다.-> 엔티티에 @Table(name="users")로 테이블명을 "users"로 변경하면 해결할 수 있다.

    [Java] String + null

    Java에서 String 타입과 null에 대해 '+' 연산을 수행하면 어떻게 될까?System.out.println("123" + null);// 결과123nullNPE가 발생할줄 알았는데, 123null이 출력된다..? 그 이유는 자바 doc을 보면 알 수 있다. If an operand of type String is null, then the string "null" is used instead of that operand. -> 어느 한 피연산자가 null이면 해당 피연산자 대신 문자열 "null"이 사용된다는 뜻이다. 만약 특정 문자열에 null이 더해질 때 NPE를 발생시키고 싶다면 String.concat() 메서드를 사용하면 된다."123".concat(null)null.concat("1..

    [Java] Suppressed Exception

    ✅ Suppressed ExceptionSuppressed Exception은 throw되지만 무시되는 예외를 말한다.예를 들어, try-catch-finally 문에서 try문에서 예외가 발생했을 때, catch문에서 예외를 받아 throw한 상황에서,finally 문에서도 예외가 발생했다면, try문에서 발생한 예외는 무시(suppressed)된다.'무시'된 예외는 실제로 throw되지 않아, stacktrace에 찍히지 않는다.-> 잘 이해가 안될 수 있는데, 다음 예제를 통해 더 자세하게 알아보자. ✅ try-catch-finally문에서 Suppressed Exceptionpublic static void demoSuppressedException(String filePath) throws IO..

    [Java] Comparator와 @FunctionalInterface

    함수형 인터페이스 공부하다가, Comparator 인터페이스 @FunctionalInterface 애노테이션이 붙은 것을 확인했다. @FunctionalInterface public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); ... } 해당 애노테이션은 Comparator가 함수형 인터페이스라고 명시하는 것이다. 그러나 함수형 인터페이스는 추상 메서드가 한 개여야 한다. 근데 Comparator는 위와 같이 추상 메서드가 두개다. -> 왜 Comparator를 함수형 인터페이스로 명시한걸까하는 의문이 들었다. 찾아보니, 모든 클래스는 Object 클래스를 상속받데, 만약 아무 것도 상속받지 않은 클래스가 있으면 ..