Spring Framework: 317개의 글
코드! 쓰기 말고 읽기.오픈소스에 기여는 못하더라도 읽기는 가능하다. 예전에 어떤 컨퍼런스에서 진성주 님이 이런 말을 했던 게 기억난다.시인이 되고 싶은 사람은 다른 사람들의 시를,화가가 되고 싶은 사람은 다른 사람의 그림을,가수가 되고 싶은 사람은 다른 사람의 노래를개발자인 우리도 다른 사람의 코드를 읽고 배울 필요가 있다. 어쩌면 우리는 일을 하다 보면 코드를 작성하는 시간보다 남의 코드를 읽는 시간이 더 많을지도 모른다.어느 날 SLiPP 스터디에서 Spring Core 스터디를 하게 됐다. 이 스터디는 이론적으로만 알고 있던 Spring Context의 코드를 읽기 위한 스터디였다. 결과론적인 이야기일 수 있지만, 나는 이 스터디를 통해 개발자로서 많은 부분이 변했다고 생각한다. 첫 번째는 코드 ..
토이 프로젝트를 서버에 배포한 후 기존에 실행되던 spring boot 애플리케이션을 죽이고(kill) 재실행하기 위해 pid를 이용했다.애플리케이션 배포기존 실행되던 애플리케이션 종료배포된 애플리케이션 실행무식한 방법으로 기존에 실행하던 애플리케이션을 죽이기로 했다. kill 하기 위해서 pid(process id)가 필요했다. 그래서 Spring boot 애플리케이션 실행 시 실행된 애플리케이션의 pid를 생성하는 방법을 찾아봤다. 쉽다.public static void main(String[] args) { SpringApplicationBuilder builder = new SpringApplicationBuilder(BookUPApplication.class); builder.build().ad..
이 글은 CompletableFuture API를 설명하는 글은 아니다. CompletableFuture로 어떻게 성능을 개선했는지에 대한 경험 글이다.개인 프로젝트로 bookup 이란 웹 애플리케이션을 개발하고 있다. 원하는 도서가 오프라인 서점에 재고가 있는지 검색하는 서비스다. 오프라인 서점마다 Open API가 없어, html 크롤링으로 개발했다. 그런데 개발하며 문제가 생겼다. 바로 오프라인 서점의 수가 많아질 수록 성능이 느려진다는 것이다. 재고 조회 순서는 아래와 같다.ISBN(도서 고유값) 값을 구하기 위해 네이버 Open API를 통해 ISBN 값을 얻는다. (API 요청)ISBN으로 오프라인 서점에 해당 도서의 재고를 순서대로 크롤링한다.왜 성능이 느릴까? 이유는 여러 http 요청을 ..
가정하나의 project에 의미가 다른 2개의 Event라는 @Entity가 필요하다.당연히 package 경로는 다르다.하나는 net.woniper.data.jpa.event1.Event (이하 event1)하나는 net.woniper.data.jpa.event2.Event (이하 event2)package만 다르며, 클래스 명은 같다.각각의 Event는 Repository가 존재한다.net.woniper.data.jpa.event1.EventRepository (이하 eventRepository1)net.woniper.data.jpa.event2.EventRepository (이하 eventRepository2) 예제 코드net.woniper.data.jpa.event1.Eventpackage net..
이 글은 Job이 어떻게 Step List를 실행하는지 코드를 보며 확인해 볼 것이다.SimpleJob.doExecute@Override protected void doExecute(JobExecution execution) throws JobInterruptedException, JobRestartException, StartLimitExceededException { StepExecution stepExecution = null; for (Step step : steps) { stepExecution = handleStep(step, execution); if (stepExecution.getStatus() != BatchStatus.COMPLETED) { // // Terminate the job ..
이번 글에선 기본 개념에 정리한 여러 클래스가 서로 어떤 의존성을 가지며, 어떻게 동작하는지 코드를 살펴볼 것이다. 모든 코드를 다 볼 수 없기에 이번 글은 Job이 어떻게 생성되고 실행되는지 살펴본다.Sample@Configuration public class SimpleConfiguration { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public Job job() { return jobBuilderFactory.get("simple-job") .start(step()) .build(); } @Bean public Step st..
Spring Batch를 사용해본 개발자라면 이 포스팅은 볼 필요 없다. Spring Batch의 기본 개념 (레퍼런스 문서에서는 domain이라고 표현한..)을 내 나름대로 정리하는 글이다. 이 글은 Spring Batch가 무엇인지, 왜 사용하는지 설명하지 않는다.기본 개념 Job : Batch에서 실행 가능한 실행 단위.JobLauncher : Job을 실행하는 책임이 있다. JobRepository를 통해 Job, Step, Item* 등을 생성하고 조립.JobRepository : DB 또는 어딘가에 저장된 Job, Step 등을 조회(select) 또는 생성(insert), 수정(update).Step : Job은 1개 이상의 Step을 포함(1:N)할 수 있고, 하나의 큰 실행 단위가 Job..
발표자료 Booting Spring Data RESTSpring Data REST 예제Spring Data REST #1 IntroductionSpring Data REST #2 동작 원리Spring Data REST #3 내부 동작 정말 Repository Interface로만 API가 동작할까? 당연히 Repository Interface만 있다고 해서 API가 동작하는 건 아니다. 우리가 Spring MVC를 사용해서 Controller를 만들어서 API를 만들듯이, Spring Data REST에는 이미 만들어진 Controller가 존재한다. 차이점이 있다면, 기존에 만들던 Controller와는 조금 다른 Spring Data REST만의 Controller를 만든다.@Reposit..
발표자료 Booting Spring Data RESTSpring Data REST 예제Spring Data REST #1 IntroductionSpring Data REST #2 동작 원리Spring Data REST #3 내부 동작 Introduction에서 Spring Data REST에 대한 간단한 소개와 사용방법을 알아봤다. Spring Data에서 제공하는 Repository interface 선언만으로 REST API가 만들어졌다.어떻게 Repository 선언만으로 REST API가 제공될까? 위 그림은 발표 장표 중 하나다. CrudRepository에 선언된 메소드가 곧 REST API로 지원되는 것이다.@RepositoryRestResource public interface ..
발표자료 Booting Spring Data RESTSpring Data REST 예제Spring Data REST #1 IntroductionSpring Data REST #2 동작 원리Spring Data REST #3 내부 동작 Spring Camp 2017에서 Spring Data REST를 소개하는 발표를 했는데, 45분이라는 시간으로 Spring Data REST(이하 Data REST)를 모두 전달하기에는 짧은 시간이다. 그래서 블로그를 통해 좀 더 많은 내용을 전달하려고 한다.IntroductionSpring Data REST 레퍼런스 문서에서 REST API는 애플리케이션 통합에서 중요한 수단이고, Spring MVC를 통해 쉽게 만들 수 있지만, 간단한 REST API를 만들..