이 글은 김영한님의 스프링 부트편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다.1. 외부설정을 왜하는가?스프링부트에서 외부설정을 지원하게된 배경을 아래에서 살펴보자.1-1. 개발과 운영환경 각각 빌드같은 코드를 두고 개발 환경과 운영 환경에 빌드를 해야한다면 위와같이 두 번 빌드를해야하는 상황이 올것이다.두 번 빌드를 한다는것은 문제가 될 수 있다.만약 추후에 운영 환경에 문제가 생겼을때 개발 환경과 같은 소스코드에서 나온 결과물인지 검증하기가 어렵다. 그래서 보통 아래와 같이 빌드는 한번만 하고 각 환경에 맞추어 실행 시점에 외부 설정값을 주입한다. * 유지보수하기 좋은 애플리케이션 개발의 기본 원칙은 변하는 것과 변하지 않는 것..
Spring
이 글은 김영한님의 스프링 고급편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 1.리플렉션(reflection) 적용 단순하게 클래스 A,B가 있을때 프록시를 적용하고 싶다면 프록시 A클래스와 프록시 B클래스를 만들어서 적용하면 될 것이다. 그런데 이는 굉장히 불편하다. 프록시 객체를 동적으로 변경할 필요가 있다. 따라서 자바에서 지원하는 리플렉션(reflection)기술을 사용하여 공통으로 프록시 객체를 생성하도록 한다. 리플렉션은 클래스나 메서드의 메타정보를 사용해서 동적으로 호출하는 메서드를 변경할 수 있다. @Test void reflection() throws Exception{ Class classHello = Clas..
이 글은 김영한님의 스프링 고급편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 프록시 패턴(Proxy Pattern) 1.정의 위는 클라이언트에서 서버를 직접 호출하는 간단한 예시이다. 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아닌 어떤 대리자를 통해 간접적으로 호출하는 예시이다. 예를 들어 내가 직접 마트에서 장을 볼 수도 있지만, 누군가에게 대신 장을 봐달라고 부탁할 수도 있는데 여기서 장을 보는 대리자를 프록시(proxy)라 한다. 2.구조 객체에서 프록시가 되려면, 클라이언트는 서버에서 요청한 것인지, 프록시에게 요청한 것인지 몰라야한다. 즉, 서버와 프록시는 같은 인터페이스를 사용해야하고 클라이언트가 사용하는..
이 글은 김영한님의 스프링 고급편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 템플릿 메서드 패턴(Template Method Pattern) 1) 정의 이름 그대로 템플릿을 사용하는 방식이다. 템플릿 메서드 패턴에서 템플릿은 기준이 되는 거대한 틀을 의미하고 여기에 변하지 않는 부분을 몰아둔 후, 일부 변하는 부분을 별도로 호출해서 해결한다. 코드로는 부모 클래스에 변하지 않는 템플릿 코드를 두고, 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용하여 처리한다. 2) 예제 템플릿 클래스 @Slf4j public abstract class AbstractTemplate { public void execute() { lon..
이 글은 김영한님의 스프링 고급편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 1. 쓰레드 로컬의 정의 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. 예를 들어,여러 사람이 같은 물건 보관 창구를 사용하더라도 창구 직원은 사용자를 인식해서 사용자별로 물건을 구분해준다. 쓰레드 로컬을 사용하지 않는 상황을 떠올려보자. 만약 일반적인 변수 필드가 있다면, 여러 쓰레드가 같은 인스턴스의 필드에 접근할때 처음 쓰레드가 보관한 데이터가 사라질 수 있다. 일반 변수 필드는 thread-B가 요청한 순간 필드값 변경요청으로 인해 userA값이 사라진다. 그러나, 쓰레드 로컬을 사용하면 각 쓰레드마다 별도의 내부 저장소를..
이 글은 김영한님의 스프링 DB 2편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 트랜잭션이 여러개 있을때, @Transactional이 있을때, 없을때 이런 헷갈리는 부분에 대해 정확하게 짚어보자. 1. @Transactional유무에 따른 호출 1-1.@Transactional이 있는 A클래스의 메서드에서 없는 B클래스의 메서드를 호출 @Transactional은 그저 트랜잭션 프록시를 생성하여 트랜잭션을 처리하는 객체를 명확하게 분리해주고 트랜잭션을 사용하게 해주는 점만 주목하면된다. 1.A클래스의 메서드에서 트랜잭션을 시작하여 B클래스의 메서드를 호출한다. 2.트랜잭션은 처음부터끝까지 유지된다. 1-2.@Transactio..
이 글은 김영한님의 스프링 DB 2편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 1. 트랜잭션AOP의 프록시 등록 원리 특정 클래스나 메서드에 @Transactional 어노테이션이 하나라도 있으면 트랜잭션 AOP는 프록시를 만들어서 컨테이너에 등록한다. 내부 프록시 객체는 실제 객체를 상속 받고 있는 형태가 된다. 우선순위 DI를 공부할때도 봤었지만 스프링은 더 구체적이고 자세한 것이 높은 우선순위를 가진다. 따라서 @Transactional 또한 우선순위 규칙이 적용된다. * @Transactional의 규칙 1. 우선순위 규칙 예를 들어 A클래스에 @Transactional(readOnly = true) , A클래스의 A메..
이 글은 김영한님의 스프링 DB 1편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다. 트랜잭션이란? 트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 의미한다. 데이터를 저장할 때 단순히 파일에 저장해도 되지만, 데이터베이스에 저장하는 이유는 트랜잭션 개념을 지원하기 때문이며, 데이터베이스에서 트랜잭션은 "하나의 거래를 안전하게 처리하도록 보장해주는 것"을 뜻한다. 트랜잭션을 사용하지 않으면? 만약 A가 B에게 계좌이체를 하는 예시를 생각해보자. A의 잔고가 5000원 감소하고, B의 잔고가 5000원 증가할것이다. 그런데 만약, A의 잔고가 5000원 감소하고 갑자기 장애가 발생한다면 B의 잔고는 증가되지않고 ..