자바 프로그래밍을 하다보면 Optional을 파라미터로 전달했을 때 컴파일러가 경고(노란줄)를 표시합니다. (IntelliJ에서는 표시해주는데 다른 IDE는 어떤지 잘 모르겠네요) 경고를 확인하기 위해 간단한 코드를 작성해보면, public void foo(String nullable) { bar(Optional.of(nullable)); } private void bar(Optional s) { // do something } 'Optional' used as type for parameter 's' 바로 이런 내용을 확인할 수 있습니다. 그렇다면 왜 Optional을 파라미터로 전달하면 안 되는 것일까요? 결론부터 말씀드리면 장점보다 단점이 많기 때문입니다. 먼저 장점으로는 전달할 당시에 별 생각 없..
Optional을 사용하다보면 마지막에 orElse() 또는 orElseGet()를 이용해 원래 값을 얻습니다. 그동안 저는 두 메서드의 차이가 단순히 전달해야하는 파라미터의 차이라고 생각했었습니다. 예를 들면 orElse(defaultValue), orElseGet(this::getDefaultValue) (또는 orElseGet(() -> getDefaultValue())) 이런식으로 하나는 값을 전달하고 하나는 구현체를 전달하기 때문에 그냥 적절하게 사용하면 되겠다는 정도로만 생각했었습니다. 그러던 중 테스트 클래스를 작성하다가 mocking을 사용하였는데 정상적으로 동작하지 않았습니다. 본문과 크게 관련 없는 내용(어떤 테스트가 동작하지 않았는지)이라 접어두겠습니다. 테스트 할 클래스는 Servi..
다형성을 사용할 때 자식 또는 구현체의 객체가 어떤 타입인지 알아보는 방법은 익히 알려져있습니다. 다음과 같은 두 개의 클래스가 있을 때, class Shape { // 생략 } class Triangle extends Shape { // 생략 } Triangle 객체가 어떤 타입인지 알아보려면 아래처럼 확인할 수 있습니다. class Scratch { public static void main(String[] args) { Triangle triangle = new Triangle(); System.out.println(triangle.getClass()); System.out.println(triangle instanceof Shape); System.out.println(triangle instan..
저는 취미생활(?)의 일환으로 네이버 지식인에 답변을 달아주고 있습니다. (현재 무려 바람신😎) 제가 대학생 때는 현재 창업한 회사에서 CTO로 활동하다가 모든 일을 맡아서 해야하는 실장이 되어버린 실력자 친구가 있었기 때문에 잘 모르면 무조건 그 친구에게 쪼르르 달려가서 질문을 하곤 했습니다. 하지만 그 친구를 만난 건 3학년 2학기.. 그 전까지는 고만고만한 친구들과 수업을 제끼고 당구를 치러 가는 게 더 좋았고, 그 친구들이 다 군대가고 나서는 혼자서 질문할 곳이 없어서 많이 힘들어하고 결국엔 휴학까지 했었습니다. 지식인에 올라오는 모든 질문이 저렇게 절박한 처지에 있는 사람이 올리는 글은 아니겠지만 혹시나 그런 처지에 있는 사람이 기댈 곳이 없어서 질문을 했을 수도 있기 때문에(?) 오지랖을 부려..
소스부터 보시죠! import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FileDownloader { public static void main(String[] args) throws IOException { URL website = new URL("https://www.naver.com/"); Re..
map.toString을 검색해서 들어오시는 분들이 많은 거 같아 간단히 설명을 추가합니다. Map 인터페이스의 구현체(대표적으로 HashMap 등)에서 toString을 호출하면 내부적으로 Map을 탐색하는 Iterator를 만들어 각 Entry를 key=value 형식의 문자열로 변환해줍니다. import java.util.HashMap; import java.util.List; import java.util.Map; class Scratch { public static void main(String[] args) { Map map = new HashMap(); map.put("boolean", true); map.put("list", List.of("a", "b", "c")); map.put("in..

모든 소스는 여기서 확인하실 수 있습니다. Optional을 Jackson을 이용해 Serialize/Deserialize하면 어떻게 될까요? Optional 필드를 가지는 Object 하나의 Optional 필드를 가지는 Name이라는 클래스를 생성하였습니다. package io.lcalmsky.jackson.domain; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Optional; public class BeanWithOptional { @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) public static class..

모든 소스는 여기서 확인하실 수 있습니다. 커스텀 애노테이션 (@JacksonAnnotationInside) @JacksonAnnotationInside 애노테이션을 사용하여 커스텀 애노테이션을 정의할 수 있습니다. package io.lcalmsky.jackson.domain.annotation; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import java.lang.annotation.Retention; import java.l..
모든 소스는 여기서 확인하실 수 있습니다. @JsonProperty JSON에서의 속성 이름을 나타냅니다. 필드 변수 또는 getter/setter 메소드에 사용할 수 있습니다. package io.lcalmsky.jackson.domain; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; public class BeanWithJsonProperty { @Getter @Setter @JsonProperty("identity") private int id; private String name; @JsonProperty("nickname") public String getName()..
모든 소스는 여기서 확인하실 수 있습니다. Jackson에서 다형성 처리를 위하여 아래와 같은 애노테이션을 사용합니다. @JsonTypeInfo: 직렬화 시 포함할 타입 정보의 세부 사항을 나타냅니다. @JsonSubTypes: 애노테이션이 달린 타입의 하위 타입을 지정합니다. @JsonTypeName: 애노테이션이 달린 타입의 논리적 이름을 지정합니다. package io.lcalmsky.jackson.domain; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; ..
- Total
- 201,571
- Today
- 8
- Yesterday
- 517
- gRPC
- Spring Boot Tutorial
- proto3
- @ManyToOne
- 스프링 부트
- JSON
- 함께 자라기
- 스프링부트
- 스프링 데이터 jpa
- leetcode
- 알고리즘
- QueryDSL
- Linux
- spring boot application
- 클린 아키텍처
- Spring Boot JPA
- JPA
- 스프링 부트 애플리케이션
- r
- Jackson
- spring boot jwt
- Spring Data JPA
- 스프링 부트 회원 가입
- 스프링 부트 튜토리얼
- Spring Boot
- Java
- intellij
- 함께 자라기 후기
- 헥사고날 아키텍처
- spring boot app