Spring Framework/Spring boot: 66개의 글
Google STMP -학교에서 진행하는 프로젝트에서 비밀번호 찾기를 구현하면서 알게된 방법이다. 개발환경 IntelliJ JPA SpringBoot Gradle *준비작업 1. 여기를 클릭해서 보안 수준이 낮은 앱의 액세스를 [허용] 으로 변경해야 합니다. 2. gradle 의존성을 추가합니다.. implementation 'org.springframework.boot:spring-boot-starter-mail' *maven을 사용한다면 아래 코드를 추가합니다. org.springframework.boot spring-boot-starter-mail 1.4.3.RELEASE 3. application.yml에 아래 내용 추가합니다. (git 커밋할때 아래 정보가 유출되지 않도록 주의!) spring:..
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와 AbstractAnnotationConf..
이번 글은 AbstractContextLoaderInitializer 클래스의 하위 클래스인 AbstractDispatcherServletInitializer클래스와 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 살펴볼 것이다.AbstractDispatcherServletInitializerAbstractContextLoaderInitializer 클래스는 ContextLoader를 통해 root WebApplicationContext를 생성하고, 초기화(refresh)한다는 걸 이해했다. 마찬가지로 AbstractDispatcherServletInitializer 클래스는 DispatcherServlet을 생성하고 초기화한다.AbstractDis..
이전 글에서 WebApplicationInitializer 구조에 대해 봤다. 이번 글은 WebApplicationInitializer 구현체 중 하나인 AbstractContextLoaderInitializer 클래스에 대해 이야기해볼 예정이다.코드를 보자.AbstractContextLoaderInitializerpublic abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer { /** Logger available to subclasses. */ protected final Log logger = LogFactory.getLog(getClass()); @Override public void onStar..
주의) 저도 처음 코드를 읽으며 작성하는 글이기 때문에 어렵게 전달되거나, 틀린 부분은 언제든 피드백을 해주세요.이번 글은 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 & buildgithub repository clone참고 : Build from Source$ git clone https://github.com/spring-projects/spring-framework.gitbuild$ cd spring-framework $ ./gradlew build프로젝트 크기가 커서 빌드가 오래 걸린다.test spring-webmvc module$ ./gradlew -a :spring-webmvc:test코드를 clone 받아 빌드 후 spring-webmvc 모듈을 test 한다. 위 ..
코드! 쓰기 말고 읽기.오픈소스에 기여는 못하더라도 읽기는 가능하다. 예전에 어떤 컨퍼런스에서 진성주 님이 이런 말을 했던 게 기억난다.시인이 되고 싶은 사람은 다른 사람들의 시를,화가가 되고 싶은 사람은 다른 사람의 그림을,가수가 되고 싶은 사람은 다른 사람의 노래를개발자인 우리도 다른 사람의 코드를 읽고 배울 필요가 있다. 어쩌면 우리는 일을 하다 보면 코드를 작성하는 시간보다 남의 코드를 읽는 시간이 더 많을지도 모른다.어느 날 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 요청을 ..