일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JavaScript
- ConcurrentHashMap
- 어플리케이션 컨텍스트
- 어플리케이션컨텍스트
- Lombok
- Java
- 스프링
- mybatis
- ApplicationContext
- 빌더패턴
- 토비
- annotationProcessor
- testAnnotationProcessor
- spring boot
- WebApplicationType
- Thread-safe
- Gradle
- 트랜잭션
- IntelliJ
- 그래이들
- Spring
- 빈 스코프
- DataSet
- java8
- RequestMapping
- Bean Scope
- 그래들
- AOP
- DispatcherServlet
- okhttp
- Today
- Total
목록전체 글 (15)
나만보는페이지
java8 (jdk 1.8.0_162) 기준으로 작성하였다. 기본적인 동작은 HashMap 과 동일하거나 비슷한 부분이 많아, HashMap 의 동작 원리 를 먼저 알아야 이해하기가 수월하다. HashMap 은 멀티스레드 환경에서 동시에 수정을 시도하는 경우 예상치 못한 결과가 발생할 수 있다. 멀티스레드 환경에서 안전하게 HashMap 을 조작할 수 있도록 java 에서 제공하는 concurrent 패키지의 자료 구조인 ConcurrentHashMap 을 사용하면서 동작 원리가 궁금해 찾아 보다가, 블로그 글마다 설명하는 내용이 다르기도 하고(java8 부터 동기화 부분 로직이 바뀌었다), 대략적인 설명만 읽어서는 잘 이해가 안되기도 했다. 그래서 직접 들어가 보기로 했다. 코드도 복잡하고, 변수 네이..
이슈가 발생한 환경은 gradle 5.2.1, jdk 1.8 이다. 그래들 컴파일 에러 IntelliJ 2020.1 버전으로 업데이트 한 후 발생 하였다. 기존에 잘 돌아가던 테스트 코드가 업데이트 후 다음과 같은 컴파일 에러가 발생 하였다. cannot find symbol variable log log 는 롬복 어노테이션인 @Slf4j 에 의해 컴파일 시 생성 된다. 원인 원인은 롬복 어노테이션 프로세서(테스트)를 추가해 주지 않았기 때문이었다. 전 버전에서도 똑같은 이슈가 있었을 텐데 버전을 업데이트 하면서, 그래들 빌드 설정이 Gradle(Default)로 변경 되면서 발생한 것이다. 언제부턴가 업데이트 될 때 마다 습관적으로 IntelliJ IDEA 로 바꿔 주고 있었는데, 그래서 인지를 못한 ..
자바스크립트에서 사용할 수 있는 빌더 패턴을 구현해보자. 위키에서 정의는 다음과 같다. 빌더 패턴(Builder pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. inner class 를 이용한 빌더 패턴 내부에 빌더 클래스를 만들어 구현하는 방식이다. 샘플 코드 class User { constructor(build) { if (build) { this.id = build.id; this.name = build.name; this.age = build.age; } } static get Builder() { class Builder { setId(id) { this.id = id; return this; } se..
[Spring] 사용자 정의 Bean Scope 만들기 싱글톤, 프로토타입 등 스프링에서 기본적으로 제공 해주는 스코프들이 있다. 기본적으로 제공되는 것 외에 내가 원하는 Scope 을 만들어서 활용해보자! 그냥 궁금하니깐 사용자 정의 빈 스코프를 만들어보자. Bean Scope⁉️ 스프링에서 빈 스코프는 쉽게 말하면 bean 의 생명 주기(수명?)를 결정하는 범위이다. 스프링이 Scope 를 이용하여 어떤 식으로 빈의 생명 주기를 관리 하는지는 기회가 되면 자세하게 써볼 예정이다. Bean Scope 종류 스프링에서 기본적으로 제공하는 대표적인 스코프는 2가지 이다. singleton 은 한번만 생성해서 컨테이너 종료까지 유지된다. prototype 은 빈 팩토리에 빈을 요청할 때 마다 새로 생성 해준..
왜 lombok 을 사용할까? 롬복(lombok)의 동작원리는 간단하게 말해 컴파일 시점에 바이트 코드를 변환하여 원하는 부분을 주입해주는 방식이다. 때문에 우린 Getter, Setter, Constructor 등을 롬복 어노테이션을 추가함으로써 의미 없는 반복적인(귀찮은) 코드를 생성하지 않아도 되고 코드를 읽는데 한층 수월해진다. 게터 함수 이름이? 하지만 가끔 변수를 선언 하다가, @Getter 를 사용하게 되면, 게터 함수의 이름이 헷갈릴 때가 있기도 하다. 내가 적용한 롬복 어노테이션이 어떻게 반영되는지, 혹은 어떻게 동작하는지 알고 싶을 때가 있다. 비교적 간단한 @Getter 나 @Setter 같은 경우에는, 해당 객체에서 IDE 의 자동완성 기능을 이용해 메서드 목록을 보면 알 수 있긴 ..
토비스프링 6장 AOP (2) AOP 용어 정리 (1) target (타깃) 타깃은 부가기능을 부여할 대상 오브젝트이다. (2) advice (어드바이스) 어드바이스는 타깃에게 제공할 부가기능을 담은 모듈이다. (3) join point (조인 포인트) 조인 포인트는 어드바이스가 적용될 수 있는 위치를 말한다. 스프링에서 조인 포인트는 메소드의 실행 단계이다. (4) pointcut (포인트컷) 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈이다. (5) proxy (프록시) 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트이다. (6) advisor (어드바이저) 포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트이다. 어떤 부가기능(advice)을 어..
[Spring MVC] DispatcherServlet boot-2.2.6(spring-5.2.5) 기준으로 작성하였다. 스프링 웹 어플리케이션을 개발하면서 항상 나의 시작점은 @Controller 였다. 쿼리 스트링으로 id=pplenty 작성하여 호출하면 당연하게 메서드에 매개변수 String id 를 추가하여 전달 받는다. Http 요청을 파싱하고 전달인자를 만들어 메서드를 호출해주는 것은 어떤 방식으로 이루어질지가 궁금하다. 브라우저를 통한 HTTP 요청이 내가 작성한 Controller 의 특정 메서드까지 도달하기 까지의 과정을 분석해보자. DispatcherServlet 스프링은 모든 요청을 하나의 서블릿(DispatcherServlet)으로 받아서, 처리할 수 있는 핸들러에게 요청을 전달해준..
patch? 패치 파일은 파일의 변경사항을 기록한 파일이다. IntelliJ 에서 파일의 변경사항을 간단하게 적용하는 방법을 알아보자. 커맨드라인을 이용하는 방법도 있지만 (git diff > test.patch) 더 심플하게 IDE 와 클립보드를 활용해본다. 파일 변경사항 클립보드(패치파일) 샘플 패치 생성 IntelliJ Version Controll(⌘ 9) 메뉴 - [Local Changes] 탭에서 로컬의 변경된 파일을 선택해서 만들 수도 있고, [Log] 탭에서 Commit 로그를 기반으로 원하는 변경사항을 선택해서 만들 수 있다. Create Patch 를 누르면, To file / To clipboard 를 선택할 수 있다. Reverse patch 는 패치 수정사항을 역으로 뒤집는 옵션이..
ok-http 학습 목표 Http client 오픈소스 라이브러리인 okhttp 의 초기버전(1.0.0)의 소스를 분석 package 구조 초기 버전이라 그런지 패키지 구조가 단순하다. okhttp, internal, internal/http, internal/spdy, internal/tls 패키지로 구분해 놓았다. 인터페이스 역할 Transport : 실제 전송을 담당하는 역할의 클래스. Returns an output stream where the request body can be written. Dns : Domain 에 매핑되는 IP 주소를 질의할 수 있는 인터페이스 제공. Domain name service. OKResponseCache : 요청에 대한 응답 캐시를 담는 역할. An exte..
토비스프링 6장 AOP (1) 학습 목표 AOP 가치를 이해하고 효과적으로 사용할 방벙을 찾아보자. 트랜잭션 코드 분리 단계 UserService 내에는 비즈니스 로직과 트랜잭션 로직이 함께 존재하기 때문에 분리 해야 한다. (1) 메소드 분리 장점 메소드가 분리되어 깔끔해짐. 단점 비즈니스 로직 코드에 트랜잭션을 적용하고 있다는 사실이 드러남. 부가기능(트랜잭션)을 어디에 적용할 것인가가 코드에 노출됨. (2) DI를 이용한 데코레이터 패턴 적용 장점 비즈니스 로직을 담은 클래스의 코드에는 영향을 주지 않고 트랜잭션이라는 부가기능을 자유롭게 부여할 수 있는 구조. 비즈니스 로직에 대한 테스트를 쉽게 만들 수 있다. 타깃의 코드를 손대지 않고, 클라이언트가 호출하는 방법도 변경하지 않은 채로 새로운 기능..
boot-2.1.3(spring 5.1.5) 기준으로 작성하였다. 스프링에서 컨트롤러 메서드가 URL 에 매핑 되는 과정을 살펴본다. 개인적으로 스프링은 naming 이 정말 쉽게 잘 되어 있다고 생각한다. RequestMapping 과 관련된 빈의 이름은 requestMappingHandlerMapping 이다. 빈 이름으로만 어떤 역할을 하는지 추정해보면 RequestMapping 과 Handler 를 매핑해 주는 빈이라고 유추가 가능하다. 빈 초기화는 ApplicationContext refresh 과정(11) 중에 일어난다. @Bean으로 설정 되어있는 RequestMappingHandlerMapping 빈의 생성 후 초기화(InitializingBean) 하는 과정을 자세하게 살펴보자! 클래스 ..
boot-2.1.3(spring 5.1.5) 기준으로 작성하였다. 스프링부트에서는 어플리케이션 타입에(Servlet/Reactive) 따라 다른 applicationContext 구현체 를 만든다. 아래 내용은 Servlet 타입 기준으로 작성하였다. ApplicationContext refresh() Spring 의 ApplicationContext 가 refresh 될 때, 어떤 과정을 거치는지 알아보자. refresh() 는 ConfigurableApplicationContext 인터페이스의 함수이다. BeanFactory 의 초기화가 이 부분에서 진행되고, Bean 이 등록되는 과정 등이 포함되어 있다. 함수 주석을 보면, XML 파일, 프로퍼티 파일 관계형 DB 등의 설정을 갱신 또는 불러오는 ..
spring classpath: vs classpath*: 이슈 Invalid bound statement (not found) 웹 어플리케이션을 리팩토링하고, 모듈 별로 분리하는 작업을 하는 과정에서 mapperLocations 에 설정된 mapper xml 을 읽지 못하고 Exception 을 뱉었다. 보통 세션팩토리 빈을 아래와 같이 설정하고, 프로퍼티 값으로 xml 의 경로를 AntPattern 으로 설정해 해당 경로의 모든 xml 을 파일을 가져올 수 있도록 설정한다. 원인 파악 리팩토링 과정에서 수정된 사항 중 의심이 가는 부분이 있었다. mapper xml 파일을 공용으로 사용하기 위해 별도의 모듈로 옮겼는데 그 부분이 문제가 될 것 같았다. 역시나 jar 로 말려 들어간 xml 파일들만 스..
dataset vs data HTML data HTMLElement.dataset 속성은 HTML tag의 커스텀 데이터 속성(data-*)을 을 읽고 쓸 수 있다. test const divTest = document.querySelector('.targetDiv'); const testData = divTest.dataset['test']; console.log(testData); // print "html" 참고 : HTMLElement.dataset jQuery data function jQuery.data() function 은 HTML tag와 관련된 데이터를 저장하거나 이미 저장된 값을 조회한다. const divTest = $('.targetDiv').data('test'); const t..
boot-2.2.6(spring-5.2.5) 기준으로 작성하였다. spring boot 에서는 아래와 같이 어플리케이션을 실행한다. 웹 어플리케이션 혹은 배치 어플리케이션이던 간에 실행 방법은 비슷하다. 궁금증 어플리케이션 타입에 따라 ApplicationContext 의 구현체도 달라지는데 스프링부트에서는 어떤 방식으로 타입을 구별하고 구현체를 선택할지가 궁금하다. 컨텍스트 생성 부분 찾기 스프링부트가 어플리케이션 컨텍스트를 생성하는 부분은 main 함수의 SpringApplication.run 스태틱 함수부터 따라가 보면 쉽게 찾을 수 있다. run 함수에서 createApplicationContext() 함수를 통해 context 를 생성한다는 걸 알 수 있다. 타입에 따른 구현체 결정 create..