본문 바로가기 메뉴 바로가기

Jaime's 기술 블로그

프로필사진
  • 글쓰기
  • 관리
  • 태그
  • 방명록
  • RSS

Jaime's 기술 블로그

검색하기 폼
  • All (443)
    • IntelliJ IDEA (7)
    • SpringBoot (83)
      • Web Application 만들기 (71)
      • JWT 튜토리얼 (5)
    • Java (13)
    • JPA (32)
    • Querydsl (14)
    • gRPC (10)
    • macOS (6)
    • Docker (1)
    • Linux (5)
    • R (5)
    • Test (3)
    • ETC (11)
    • Algorithm (227)
      • LeetCode Daily Challenge (220)
    • Retrospect (4)
    • git (1)
    • Architecture (8)
    • Book (10)
      • 함께 자라기 (7)
      • 프로그래머의 뇌 (3)
    • Essay (1)
  • 방명록

Java (13)
Optional을 파라미터로 전달하지 말자

자바 프로그래밍을 하다보면 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을 파라미터로 전달하면 안 되는 것일까요? 결론부터 말씀드리면 장점보다 단점이 많기 때문입니다. 먼저 장점으로는 전달할 당시에 별 생각 없..

Java 2023. 2. 3. 04:38
Optional에서 orElse()와 orElseGet()은 무슨 차이가 있을까?

Optional을 사용하다보면 마지막에 orElse() 또는 orElseGet()를 이용해 원래 값을 얻습니다. 그동안 저는 두 메서드의 차이가 단순히 전달해야하는 파라미터의 차이라고 생각했었습니다. 예를 들면 orElse(defaultValue), orElseGet(this::getDefaultValue) (또는 orElseGet(() -> getDefaultValue())) 이런식으로 하나는 값을 전달하고 하나는 구현체를 전달하기 때문에 그냥 적절하게 사용하면 되겠다는 정도로만 생각했었습니다. 그러던 중 테스트 클래스를 작성하다가 mocking을 사용하였는데 정상적으로 동작하지 않았습니다. 본문과 크게 관련 없는 내용(어떤 테스트가 동작하지 않았는지)이라 접어두겠습니다. 테스트 할 클래스는 Servi..

Java 2023. 2. 1. 10:30
어떻게 객체가 아닌 타입이 다른 클래스의 Subclass 타입인지 알 수 있을까?

다형성을 사용할 때 자식 또는 구현체의 객체가 어떤 타입인지 알아보는 방법은 익히 알려져있습니다. 다음과 같은 두 개의 클래스가 있을 때, 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..

Java 2022. 8. 22. 10:30
Java, JVM, JDK, JRE는 어떻게 다른가?

저는 취미생활(?)의 일환으로 네이버 지식인에 답변을 달아주고 있습니다. (현재 무려 바람신😎) 제가 대학생 때는 현재 창업한 회사에서 CTO로 활동하다가 모든 일을 맡아서 해야하는 실장이 되어버린 실력자 친구가 있었기 때문에 잘 모르면 무조건 그 친구에게 쪼르르 달려가서 질문을 하곤 했습니다. 하지만 그 친구를 만난 건 3학년 2학기.. 그 전까지는 고만고만한 친구들과 수업을 제끼고 당구를 치러 가는 게 더 좋았고, 그 친구들이 다 군대가고 나서는 혼자서 질문할 곳이 없어서 많이 힘들어하고 결국엔 휴학까지 했었습니다. 지식인에 올라오는 모든 질문이 저렇게 절박한 처지에 있는 사람이 올리는 글은 아니겠지만 혹시나 그런 처지에 있는 사람이 기댈 곳이 없어서 질문을 했을 수도 있기 때문에(?) 오지랖을 부려..

Java 2020. 7. 21. 09:37
URL을 이용하여 파일 다운 받기

소스부터 보시죠! 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..

Java 2020. 6. 17. 00:34
Map.toString()을 다시 Map으로 역직렬화 할 수 있을까?

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..

Java 2020. 4. 22. 08:43
Jackson의 모든 것 - Optional

모든 소스는 여기서 확인하실 수 있습니다. 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..

Java 2019. 12. 4. 10:33
Jackson의 모든 것 - 커스터마이징 편

모든 소스는 여기서 확인하실 수 있습니다. 커스텀 애노테이션 (@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..

Java 2019. 11. 26. 09:32
Jackson의 모든 것 - 일반편

모든 소스는 여기서 확인하실 수 있습니다. @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()..

Java 2019. 11. 22. 12:19
Jackson의 모든 것 - 다형성 편

모든 소스는 여기서 확인하실 수 있습니다. 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; ..

Java 2019. 11. 21. 16:27
이전 1 2 다음
이전 다음
공지사항
최근에 올라온 글
  • 프로그래머 밈(meme) 모음
  • Optional을 파라미터로 전달하지 말자
  • Optional에서 orElse()와 orElse⋯
  • I/O는 더 이상 Bottleneck이 아니다
최근에 달린 댓글
  • 안녕하세요! 알림설정까지 잘 왔습니다. 헌데 알림이라⋯
  • 안녕하세요, 쭈욱 보다가 질문이생겼습니다. 로그인 할때⋯
  • Form과 Entity의 차이를 질문하신 게 맞을까요?⋯
  • 컨트롤러에서 리턴 값이 String이고 RestCont⋯
Total
201,571
Today
8
Yesterday
517
링크
  • github
TAG
  • 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
more
«   2023/03   »
일 월 화 수 목 금 토
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
  • 2023/02 (3)
  • 2022/12 (1)
  • 2022/09 (13)
  • 2022/08 (31)

Blog is powered by Tistory / Designed by Tistory

티스토리툴바