일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- REST API
- spring jpa
- spring boot
- batch
- spring batch 코드
- spring bean
- tomcat
- docker
- spring-webmvc #코드읽기
- ApplicationPidFileWriter
- static inner class
- 세미나
- spring boot tomcat
- Data REST
- JPA
- SuperTypeToken
- Spring
- Spring Batch
- spring-webmvc
- ORM
- spring camp
- IntelliJ
- 코드 리뷰
- JPA mapping
- 톰캣
- Spring Data REST
- JUnit
- spring-mvc
- spring pid
- Spring Data JPA
- Today
- Total
목록Spring (38)
woniper

DispatcherServlet 클래스를 읽어보며 여러 가지 Resolver가 존재한다는 것을 알았다. Resolver는 뜻 그대로 무언가를 해결한다는 의미다. ViewResolver는 View를 어떻게 만들 것인지, LocaleResolver는 어떻게 지역화(언어)를 선택할 것인지 해결한다. 어렵지 않은 코드라 생각해서 (사실은 귀찮아서) 여러 Resolver 코드 읽기는 하지 않겠다. 이번 글은 HandlerMapping이 무엇인지 알아보고 코드를 살펴보자. HandlerMapping의 역할 코드를 살펴보기 전에 HandlerMapping이 어떤 역할을 하는지 알아야겠다. HandlerMapping 문서에는 아래와 같이 설명한다. Request와 Handler 객체 간의 매핑을 정의한다. 프레임워크에..
Spring-MVC로 웹 애플리케이션을 개발하면 아래와 같은 Controller를 만든다. @Controller public class HelloController { @GetMapping("/hello") public String hello() { return "hello Spring~"; } } 어떻게 @Controller 선언 만으로 메소드가 실행되고, Controller 실행 전/후로 전처리, 후처리 가능한 Interceptor가 동작할까? 뿐만 아니라, 파일 업로드, View 반환 등 Spring-MVC에서 제공되는 여러 가지 기능들은 어떻게 실행될까?Spring-MVC 읽기 #5. AbstractDispatcherServletInitializer와 AbstractAnnotationCon..
이번 글은 AbstractContextLoaderInitializer 클래스의 하위 클래스인 AbstractDispatcherServletInitializer 클래스와 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 살펴볼 것이다. AbstractDispatcherServletInitializer AbstractContextLoaderInitializer 클래스는 ContextLoader를 통해 root WebApplicationContext를 생성하고, 초기화(refresh)한다는 걸 이해했다. 마찬가지로 AbstractDispatcherServletInitializer 클래스는 DispatcherServlet을 생성하고 초기화한다. Abstrac..
이전 글에서 WebApplicationInitializer 구조에 대해 봤다. 이번 글은 WebApplicationInitializer 구현체 중 하나인 AbstractContextLoaderInitializer 클래스에 대해 이야기해볼 예정이다.코드를 보자. AbstractContextLoaderInitializer public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer { /** Logger available to subclasses. */ protected final Log logger = LogFactory.getLog(getClass()); @Override public void onSt..
주의) 저도 처음 코드를 읽으며 작성하는 글이기 때문에 어렵게 전달되거나, 틀린 부분은 언제든 피드백을 해주세요. 이번 글은 Spring-MVC의 시작에 대해 알아볼 것이다. public static void main(String... args) {} java 개발자라면 위 코드는 익숙하다. java에서 main 메소드는 애플리케이션의 최초 시작점이다. 그런데 Spring-MVC로 개발한 웹 애플리케이션을 war로 빌드 후 Web Application Server(이하 WAS)로 실행하는 경우엔 main 메소드가 최초 시작점이 아닌 것을 알 수 있다. WAS 실행이 최초 시작점이라고 볼 수도 있겠다. Spring Boot를 사용하면 main 메소드가 최초 시작점이다. 이 글은 Spring Boot를 이야..
Spring-MVC는 Spring Framework의 feature 중 하나다. 때문에 코드를 보기 위해서는 Sprig Framework github 코드를 clone 해야 한다. clone & build github repository clone 참고 : Build from Source $ git clone https://github.com/spring-projects/spring-framework.git build $ cd spring-framework $ ./gradlew build 프로젝트 크기가 커서 빌드가 오래 걸린다. test spring-webmvc module $ ./gradlew -a :spring-webmvc:test 코드를 clone 받아 빌드 후 spring-webmvc 모듈을 t..
코드! 쓰기 말고 읽기. 오픈소스에 기여는 못하더라도 읽기는 가능하다. 예전에 어떤 컨퍼런스에서 진성주 님이 이런 말을 했던 게 기억난다. 시인이 되고 싶은 사람은 다른 사람들의 시를, 화가가 되고 싶은 사람은 다른 사람의 그림을, 가수가 되고 싶은 사람은 다른 사람의 노래를 개발자인 우리도 다른 사람의 코드를 읽고 배울 필요가 있다. 어쩌면 우리는 일을 하다 보면 코드를 작성하는 시간보다 남의 코드를 읽는 시간이 더 많을지도 모른다. 어느 날 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..
이 글은 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.Event p..
Spring Batch의 동작 코드 #Job 생성과 실행 글에서 Job이 어떻게 생성, 실행되는지 코드를 보며 확인했다.이 글은 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..
누구나 아는 Spring Batch 기본 개념에서 Spring Batch Domain에 대해 간단히 알아보았다. 이번 글에선 기본 개념에 정리한 여러 클래스가 서로 어떤 의존성을 가지며, 어떻게 동작하는지 코드를 살펴볼 것이다. 모든 코드를 다 볼 수 없기에 이번 글은 Job이 어떻게 생성되고 실행되는지 살펴본다. Sample @Configuration public class SimpleConfiguration { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public Job job() { return jobBui..