일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring bean
- Spring Batch
- Data REST
- spring boot tomcat
- spring-webmvc #코드읽기
- spring-webmvc
- Spring
- spring-mvc
- ORM
- JPA
- JPA mapping
- ApplicationPidFileWriter
- batch
- spring jpa
- SuperTypeToken
- tomcat
- IntelliJ
- 코드 리뷰
- spring camp
- docker
- spring boot
- static inner class
- Spring Data REST
- 세미나
- 톰캣
- spring batch 코드
- JUnit
- Spring Data JPA
- REST API
- spring pid
- Today
- Total
목록net.woniper.java (163)
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..
개발 하다 보면 가끔 inner class를 사용하는 경우가 있다. outer class에서만 사용하는 경우 outer class에만 멤버 변수로 선언되어 있고, 외부에서 생성할 수 있어야 하는 경우 책임을 분리하고 싶지만, 외부로 노출하지(사용하지) 못해야 하는 경우 나는 대략 위와 같은 기준으로 inner class를 만들어 사용한다. inner class는 non static inner class와 static inner class로 나뉜다. 그 외 메소드에서 선언되는 local class(지역 클래스)와 anonymous inner class(익명 클래스)도 있다. 이 글은 non static inner class와 static inner class만 설명한다. non static inner cl..
이 글은 CompletableFuture API를 설명하는 글은 아니다. CompletableFuture로 어떻게 성능을 개선했는지에 대한 경험 글이다. 개인 프로젝트로 bookup 이란 웹 애플리케이션을 개발하고 있다. 원하는 도서가 오프라인 서점에 재고가 있는지 검색하는 서비스다. 오프라인 서점마다 Open API가 없어, html 크롤링으로 개발했다. 그런데 개발하며 문제가 생겼다. 바로 오프라인 서점의 수가 많아질 수록 성능이 느려진다는 것이다. 재고 조회 순서는 아래와 같다. ISBN(도서 고유값) 값을 구하기 위해 네이버 Open API를 통해 ISBN 값을 얻는다. (API 요청) ISBN으로 오프라인 서점에 해당 도서의 재고를 순서대로 크롤링한다. 왜 성능이 느릴까? 이유는 여러 http ..
나는 최대한 intellij를 이용해 모든 개발을 끝내려고 노력한다. 개발을 하다 보면 실제 native query를 실행해 해야 경우도 있고, terminal을 사용해야 하는 경우, http request 요청 등을 하기 위해 intellij 외에 필요한 tool이 필요하다, intellij는 이런 기능을 대부분 지원한다. 특히 자주 사용하는 기능은 Database이다. 그런데 언제부턴가 버전업을 한 후에 SQL keyword 가 대문자로 자동완성 되던 것이 소문자로만 나왔다. 큰 문제는 없지만, 그동안 사용하던 대문자로 나오는 게 좋았다. 변경 Preferences > Editor > Code Style > SQL > General > Word Case > keywords > To upper 로 변경..
가정 하나의 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..