소스부터 보시죠! 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..
자바의 ORM 표준 기술로 애플리케이션과 JDBC API 사이의 인터페이스 역할을 합니다. 여기서 ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 매핑을 말합니다. ORM 프레임워크가 해당 기능을 제공합니다. 즉, ORM 프레임워크를 이용하면 자바 컬렉션을 사용하듯이 데이터베이스의 데이터를 다룰 수 있습니다. ORM 프레임워크는 Entity라고 부르는 객체를 분석하여 SQL문을 생성하고 JDBC API를 사용하여 데이터베이스와 연동합니다. 단순히 연동만 하는 것이 아니라 앞서 다뤘던 문제들(이전 포스팅 참조, SQL의 문제점, 객체와 데이터베이스의 체계와 한계)을 극복할 수 있게 해줍니다. 따라서 보다 정교한 모델링을 각각의 환경에 맞게 할 수 있습니다. 한마디로..
객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 등 복잡성을 제어하기 위한 다양한 방법을 제공합니다. 그래서 대부분 큰 시스템을 구축한 곳에서는 객체지향 언어를 채택하여 개발하고 있습니다. 애플리케이션에서 사용하는 도메인 모델을 객체로 정의하게 되면 위와 같은 객체지향 프로그래밍의 장점을 활용할 수 있습니다. 객체를 정의하여 인스턴스화 하더라도 이는 메모리에 상주하기 때문에 애플리케이션이 종료하는 시점에 같이 사라지게 됩니다. 따라서 이 메모리에 상주시킬 데이터를 영구적으로 보관하기 위한 장소가 필요합니다. 객체는 속성과 기능을 가지는데 기능은 이미 클래스에 정의되어 있으므로 속성만 영구적인 보관 장소에서 불러와 인스턴스화 시키면 속성과 기능을 모두 사용할 수 있는 상태가 됩니다. 이때 영구적인 보..
제목을 편의상 SQL의 문제점이라고 적었습니다만 소스코드에서 직접 SQL을 다룰 때 발생하는 문제에 대해 이야기해보려고 합니다. 자바로 개발하는 대부분의 애플리케이션에서는 관계형 데이터베이스를 저장소로 사용합니다. 데이터 관리를 위해선 SQL을 사용해야 하고 이는 자바 개발자에게는 매우 익숙한 환경 & 상황이라고 할 수 있습니다. 1. 필연적인 반복 자바 애플리케이션에서 JDBC API를 이용하여 데이터베이스와 연동하기 위해서는 수많은 반복을 필요로 합니다. CRUD를 위한 API를 만드는 작업과 조회한 결과를 매핑하는 작업 등이 이에 해당합니다. 간단히 예를 들어보겠습니다. 축덕인 저는 축구 선수들의 스탯을 기록하는 player라는 테이블을 생성하였습니다. package io.lcalmsky.jpa.j..
JPA는 데이터베이스 기술보다는 데이터를 객체지향 관점으로 관리할 수 있는 객체지향 기술로 전 세계 스프링 개발자들이 가장 많이 사용하는 데이터 처리 기술입니다. 보통 JPA를 처음 접한 개발자들은 여느 다른 프레임워크와 마찬가지로 '와! 이런 걸 어떻게 생각해냈지?'라는 생각을 하게 될 것입니다. 기존의 JDBC API부터 JdbcTemplate, iBatis, myBatis에 이르기까지 점점 편리해졌다고는 하지만 약간의 노가다(?)가 포함된 작업들을 해왔던 개발자들에게는 하나의 단비와도 같은 기술이라고 할 수 있겠습니다. 자바 ORM 표준인 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스를 매핑해줍니다. JPA를 도입하게되면 개발 생산성, 유..
먼저 배포할 모듈의 build.gradle 파일에 uploadArchives 라는 태스크를 추가합니다. 태스크 추가를 위해선 maven 플러그인이 필요하고 그 외의 메타데이터 정보들을 추가해주시면 됩니다. plugins { id 'maven' // 생략 } group = 'com.example.package' version = '0.0.1' sourceCompatibility = '1.8' archivesBaseName = 'example-archives-base-name' // 생략 uploadArchives { repositories { mavenDeployer { repository(url: 'path/to/repository') { authentication(userName: 'repository..
모든 소스는 여기서 확인하실 수 있습니다. 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..
모든 소스는 여기서 확인하실 수 있습니다. 지난 포스팅에 이어서 JUnit5에서 추가된 내용을 간략하게 다뤄보려고 합니다. Dependencies ext { junitJupiterVersion = '5.4.2' junitPlatformVersion = '1.2.0' junitVintageVersion = '5.4.2' } dependencies { // junit5 testImplementation "org.junit.platform:junit-platform-runner:${junitPlatformVersion}" testImplementation "org.junit.vintage:junit-vintage-engine:${junitVintageVersion}" testImplementation "org..
모든 소스는 여기서 확인하실 수 있습니다. 개요 JUnit은 자바 생태계에서 가장 유명한 단위 테스트 프레임워크 입니다. 특히 JUnit5 버전에는 다양한 스타일의 테스트가 가능할뿐만 아니라 Java 8 버전 이상의 새로운 기능을 지원하기위한 여러 가지 혁신적인 기능이 포함되어 있습니다. 의존관계 - maven org.junit.jupiter junit-jupiter-engine 5.5.2 test - gradle testCompile 'org.junit.jupiter:junit-jupiter-engine:5.5.2' 2019년 9월에 release된 5.5.x 버전을 사용하였습니다. 자바 8버전 이상에서만 동작합니다. 아키텍처 JUnit5는 세 가지 하위 프로젝트 모듈로 구성되어 있습니다. JUnit ..
모든 소스는 여기서 확인하실 수 있습니다. 커스텀 애노테이션 (@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; ..
모든 소스는 여기서 확인하실 수 있습니다. @JsonIgnoreProperties @JsonIgnoreProperties는 Jackson이 무시할 속성 또는 속성 리스트를 나타냅니다. 문자열 배열 형식으로 나타낼 수 있습니다. package io.lcalmsky.jackson.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) @JsonIgnoreProperties("password") pu..
모든 소스는 여기서 확인하실 수 있습니다. @JsonCreator 역 직렬화에 사용되는 생성자나 팩토리를 조정할 수 있습니다. 필요한 대상 엔터티와 정확히 일치하지 않는 일부 JSON을 역 직렬화해야 할 때 유용합니다. 아래와 같은 JSON이 존재하고 { "id": 1, "theName": "beanName" } 대상 엔터티에는 "theName" 필드가 존재하지 않지만 엔터티 자체를 변경하고 싶지 않을 때 생성자에 @JsonCreator주석을 달고 @JsonProperty를 사용하여 해결할 수 있습니다. package io.lcalmsky.jackson.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jac..
- Total
- Today
- Yesterday
- QueryDSL
- leetcode
- @ManyToOne
- gRPC
- Spring Boot
- Spring Data JPA
- r
- 스프링 부트 회원 가입
- spring boot jwt
- 함께 자라기
- 스프링 부트 애플리케이션
- JPA
- 스프링 부트
- Linux
- 클린 아키텍처
- JSON
- spring boot application
- Jackson
- Java
- 스프링부트
- 헥사고날 아키텍처
- Spring Boot Tutorial
- intellij
- 함께 자라기 후기
- 알고리즘
- Spring Boot JPA
- 스프링 데이터 jpa
- spring boot app
- proto3
- 스프링 부트 튜토리얼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |