본문 바로가기
반응형

전체 글98

[자바] @JsonTypeInfo, @JsonSubTypes 를 활용하여 수정 이력 쌓아보기 다양한 도메인의 백오피스 어드민을 개발하다보면 필수 요구사항으로 수정 이력 기능이 항상 포함되어 있습니다. 데이터에 대한 트래킹을 하기 위해 이 기능이 필요한데, 다양한 방법을 활용하여 구현할 수 있습니다. 이번에는 Jackson 라이브러리에서 제공하는 @JsonTypeInfo 와 @JsonSubTypes 를 활용하여 수정 이력 데이터를 쌓아보도록 하겠습니다. (구글에 찾아보니 대부분의 경우 spring-data-envers 라는 라이브러리를 활용하는 예시를 찾아볼 수 있었는데, 다음에는 spring-data-envers 를 활용해보고 비교를 한번 해보면 좋을 것 같습니다.) 환경 및 요구사항 수정 이력이 쌓이는 환경은 다음과 같다. 예시: 상품 (Product) 도메인 상품 (Product) 엔티티와 .. 2023. 3. 17.
[프로젝트] 기획전 관리 백오피스 새로 만들기 보호되어 있는 글 입니다. 2023. 3. 11.
Config data resource ... via location ... does not exist 배경 멀티 모듈 환경에서 신규 모듈을 추가 해당 신규 모듈에 property 파일을 추가 에러 신규 모듈의 property 파일을 다른 모듈에서 import 를 하니, 아래와 같은 에러가 발생 해결 방안 시도 1. 잘못 적은 부분이 있는지 확인하기 신규 모듈의 property 파일의 파일명과 import 하는 곳에 작성된 파일명이 동일한지 확인하기 보통 잘못 적었을 확률이 큰데 (e.g., 스펠링 오류), 이렇게 했는데도 안되면 시도 2를 해보자. spring: config: import: - 'classpath:xxx-yyy-zzz.yml' // 스페이스가 있으면 안됨 참고로 classpath: 하고 한칸 띄어쓰기를 했는데, 작동이 안되었다. 스페이스가 있으면 안되나보다. 시도 2. build.grad.. 2023. 3. 8.
[코틀린] 삼항연산자 사용하기 자바에서 프로그래밍을 할 때 삼항연산자를 즐겨 사용했습니다. 그 이유는 간단한 if-else 에 대해서는 one-line 에 작성할 수 있어서 가독성도 괜찮다고 생각하기 때문입니다. 최근에 코틀린을 사용하면서 자바처럼 삼항연산자를 사용하려고 했는데, 코틀린에서는 제공이 안된다는 사실을 알게 되었습니다. 코틀린에서는 어떻게 대체해서 사용할 수 있을지 알아보려고 합니다. 방법 1. if-else 사용하기 if 문구에 조건문을 입력하고, 참일 때의 값, 거짓일 때의 값을 입력한다. 괄호를 사용하여 표현식을 작성할 수도 있다. fun isCoffee(drinkType: String): Boolean { return if(drinkType.equals("COFFEE")) true else false } val d.. 2023. 3. 7.
[독서정산] Effective Java 2/E - 1부. 객체의 생성과 삭제 규칙 1. 생성자 대신 정적 팩토리 메소드를 고려해보자 정적 메소드에는 이름이 존재한다. 정적 팩토리 메소드에는 이름이 존재하기 때문에 생성자보다 반환될 객체의 특성을 더 잘 설명할 수 있다. 생산성을 높여주고 가독성을 높인다는 부분에서 공감한다. 대신 메소드의 이름을 잘 작명해야 하겠지? 아래 예시에서 reviewA 와 reviewC 는 단순히 생성자만을 활용했다. 파라미터의 개수가 작아서 관리하기 쉬울 수 있지만 파라미터 개수가 많아진다면? reviewB 와 reviewD 가 생성된 것처럼 정적 메소드를 활용하면 좀 더 이해하기 쉽게 표현할 수 있다. public static void main(String[] args) { Review reviewA = new Review("배송 굳", 5); // .. 2023. 3. 6.
[스프링] @ConstructorProperties 활용하기 (feat. Jackson 라이브러리) POST 형식의 REST API 를 작성할 때, 요청 값을 주로 JSON 형태로 전달받는다. 이 데이터를 내부에서 사용할 수 있도록 맵핑 DTO 가 필요하고 주로 @RequestBody 어노테이션을 활용하여 전달받게 된다. 다음과 같이 코드를 작성할 수 있다. @Getter public class SampleRequestBody { private final String sampleName; private final Long sampleNumber; public SampleRequestBody(String sampleName, Long sampleNumber) { this.sampleName = sampleName; this.sampleNumber = sampleNumber; } } @PostMapping.. 2023. 3. 5.
[프로젝트] 생각보다 쉽지 않았던 API 교체하기 MSA 환경에서는 주로 API 호출을 통해 타 서비스와 통신을 주고 받습니다. 타 서비스에서 제공하는 API 의 스펙이 변경되면 이 API 에 의존하고 있는 내부 서비스도 맞춰서 변경을 해주어야 합니다. 단순히 생각하면 기존 API 로의 호출을 끊고, 버전업이 된 API 로 호출하기만 하면 될 것 같습니다. 아래 그림처럼요. 하지만 이렇게 단순하지는 않았고, 좀 더 복잡했습니다. API 를 교체하는 방법에 대해 한번 정리해보고자 합니다. 들어가기에 앞서 용어 정리를 먼저 하려고 한다. 외부 서비스에서 제공되던 기존 API 는 "API v1" 외부 서비스에서 제공될 신규, 버전업된 API 는 "API v2" 상황에 대한 이해 API 를 교체해야 했던 당시 상황은 다음과 같다. 상황 1. API v1 의 D.. 2023. 3. 4.
[자바] 인터페이스와 추상 클래스 (feat. ChatGPT) 신입 개발자 단골 면접 질문이 있습니다. 자바의 인터페이스와 추상 클래스를 어떻게 활용할 수 있는지 예시와 함께 설명해보라는 것인데요. 저는 여태 개발을 하면서 인터페이스는 자주 사용했지만 추상 클래스는 자주 사용하지 않아 (거의 없었던 것 같습니다) 예시와 함께 한번 정리해보고자 합니다. 적합한 예시는 많겠지만 제가 좋아하는 "라면"을 가지고 예시를 들어볼게요. 그리고 요즘 유행하는 ChatGPT 의 도움도 살짝 받아보겠습니다. ChatGPT, 추상 클래스를 알려줘 ChatGPT 가 알려주는 추상 클래스는 하나 이상의 추상 메소드를 포함하는 클래스이다. 추상 메소드는 구현되지 않은 메소드로 자식 클래스에서 구현해야 한다. 자세한 내용은 ChatGPT 를 참고.. 결국 클래스의 종류인데, 하나 이상의 추.. 2023. 3. 3.
반응형