Programming-[Backend]/Java 25

[TIL][작성Java - @RequestBody null 문제: jackson, @NotNull, @NoArgsConstructor

문제 상황 controller와 @RequestBody를 아래처럼 정의하고, http POST request을 json 형태로 전송했다. 그런데 에러가 발생했다. @PostMapping("/stock") public void stockItem(@RequestBody @Valid ItemPo itemPo) { ... } // @Data public class ItemPo { @NotNull private ItemType itemType; } 에러코드 일부 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of ... (no Creators, like default construc..

[TIL] 클래스 내 private 메서드 임시 테스트 @PostConstruct, Column 이름 예약어 escape 처리

1. 클래스 내 private 메서드 임시 테스트 테스트 코드를 남길 필요가 없거나, 테스트를 하기가 곤란한 경우 임시로 빠르게 테스트를 할 수 있는 방법으로 @PostConstruct를 이용할 수 있다. DB에 잘못된 데이터가 삽입될 수 있으므로 사용에 주의해야한다!! 위 그림처럼 Class내에 save... 메서드가 있고 이것을 임시 테스트하고 싶다면 @PostConstruct의 init() 메서드에 해당 메서드를 불러와서 실행하면 된다. 메서드에 들어가는 인자값들을 세팅해주고 세팅 과정에서 필요하다면 XxxRepository 같은 다른 클래스를 @Autowired로 주입받으면 된다. 이후 디버깅 모드로 breakpoints를 잡고 테스트해보면 파악이 힘든 에러나 동작 테스트를 임시로 해볼 수 있다...

자바 입력 : InputStream, InputStreamReader, BufferedStream, Scanner

자바의 기본 입력 API인 InputStream 등에 대해서 학습한다. 참조1의 설명이 잘 나와있어서, 그대로 따라해보며 기록 하였다. 1. Stream Stream은 마치 물이 연속적으로 흐르는 것과 같이 데이터가 연속적으로 존재한다는 것을 표현한 객체이다. 컴퓨터는 이진수로 이루어진 비트로 정보를 주고 받으며, 일반적으로 바이트코드(byte)로 데이터를 전달하기 때문에 스트림도 byte의 연속된 집합이라고 할 수 있다. 사용자의 키보드 입력, 파일 데이터, HTTP 송수신 데이터 등이 모두 스트림으로 간주되어 스트림 관련 API를 통해서 데이터를 처리하게 된다. 2. InputStream InputStream은 1996년 JDK 1.0에서 도입되었다. java.io 패키지에 속해 있다. InputSt..

에러 발생 시 특정 기능을 하도록 만들기 : 정적 팩토리 메서드

1. 필요성 에러가 발생했을 때, 에러 객체를 만들면서 동시에 메시지를 쏘는 기능을 하도록 만들어야했다. 에러 객체를 new 키워드를 써서 생성자를 통해 만들어주고, 이후에 메시지를 쏴야하는데 이미 에러는 throw 되어 그 다음 코드는 실행하지 않게 되었다. if(error) { throw new MessageException("에러 발생"); sendMessage(); //실행되지 않음 } 2. 해결방법 MessageException 객체의 생성자 자체에 sendMessage 로직을 넣어주면 된다! 그러나 이런 경우에는 의미를 명확하게 하기 위해서 MessageException 객체가 정적 팩토리 메서드로 만들어지도록 하는 것이 추천된다. public static MessageException get..

[TIL][링크] 자바 리스트 stream split 처리 - groupingBy

Java8 Collectors groupingBy Map groups = testList.stream().collect(Collectors.groupingBy(i -> i / 3)); List listByCollectors = new ArrayList(groups.values()); //will be.. listByCollectors = {ArrayList@1058} size = 4 0 = {ArrayList@1093} size = 3 1 = {ArrayList@1094} size = 3 2 = {ArrayList@1095} size = 3 3 = {ArrayList@1096} size = 1 출처: https://jinseongsoft.tistory.com/312 [진성 소프트]

[TIL] 생성자 내부 멤버 메서드 실행(생성자 안에서 메서드 실행)

1. 배경 생성자 내부에서 메서드를 실행할려고 했다. 아래와 같은 코드이다. public MessageQueueAccessor(String name) { super(); this.name = name; } public MessageQueueAccessor(String name, String url) { super(); this.name = name; this.url = url; this.sendMessage(); //중략 private void sendMessage() { //로직 } } 즉 name, url을 인자로 받는 특정 생성자를 통해 인스턴스를 생성하는 경우 필드값을 초기화할 뿐 아니라, 멤버 메서드인 sendMessage 로직도 실행하고자 했다. 그런데 역할상 생성자가 초기화에만 관여해야지, ..

[링크] isAssignableFrom 과 instanceof의 차이

1. 문법 차이 s instanceof String s.getClass().isAssignableFrom(String.class) 2. 확인 시점 차이 instanceof 은 컴파일 시점에 타입 체크 isAssignableFrom은 런타임 시점에 불특정한 클래스에 대한 타입 체크 다시 말해 instanceof 쓰면 쓰는 순간 IDE에서 바로 잡아냄, isAssignableFrom은 프로그램 실행하고 실제 해당 구문이 실행될 때 클래스 타입을 확인함 3. null Safe 차이 null instanceof {어떤 클래스} 는 false 반환 {어떤 클래스}.class.isAssignableFrom(null)은 NullPointerException 반환 참조 https://blog.naver.com/Post..

[TIL][링크][작성중] 자바 어노테이션 및 리플렉션(Java Annotation, Reflection)

리플렉션 기초개념 어떤 클래스의 멤버 변수, 메서드 등을 호출할 수 있다. (예시 추가) class의 변수들은 그야말로 변수다. 아직 어떤 값이 지정될 지 모른다. 클래스의 변수들은 생성자를 통해 인스턴스가 생성되면서 그 값들이 정해지므로 constant 하지 못하다. 어노테이션에서 attribute로 지정하기 위해서는 constant해야만 한다. 따라서 클래스 자체를 어노테이션의 속성값으로 지정할 수는 없다. 리플렉션 사용 시 유의점 인스턴스가 이미 생성되있는 경우라면 굳이 리플렉션을 사용할 필요가 없다. 성능에 좋지 않다. 컴파일 단계에서는 확인 불가하고 런타임에서만 오류를 확인할 수 있다. .setAccessible(true) 메서드를 통해서 접근 지정자(Java Access Modifier)를 무..

[작성중] 서비스 버스, jms 등

개요 jms는 자바에서 제공하는 메시징 서비스이다. 메시징 서비스는 서로 다른 네트워크를 갖는 서비스(애플리케이션)들간에 데이터를 비동기적으로 받을 수 있게 해준다. 다시 말해 서비스 1과 서비스 2 사이에 직접적인 통신이 일어나는 것이 아니라 서비스 1과 서비스 2 사이에 서비스 버스라고 하는 큐(Queue)가 있어서 서비스 1과 서비스 2 사이의 통신을 받아들이고 저장하는 역할을 한다. 서비스 1에서 특정 로직이 끝나고 서비스 버스로 완료된 데이터가 담겨있는 문자열을 보내면 서비스 버스에 해당 데이터가 '메시지(레터)'라는 이름으로 쌓이게 할 수 있다. 그럼 서비스 2가 서비스 버스에 접근해서 이 데이터를 확인하고 서비스 2의 특정 로직을 실행하거나 관련 데이터베이스에 정보를 저장할 수 있게 된다. ..