Spring
Spring Batch 멀티 프로세스
Spring Batch 멀티 프로세스
2024.09.09FutureTask FutureTask task = new FutureTask(Callable) - Thread 가 수행하는 Task로서 Callable 을 실행시키고 결과를 Future에 담아 반환 - Runnable 은 스레드를 실행하고 코드를 실행할 수 있는 인터페이스를 제공하며, 반환 값을 가질 수 없다. 반면에 Callable 은레드를 실행하고 코드를 실행하면서 반환 값을 가질 수 있다. 스프링 배치 멀티 스레드 프로세싱Step 안에 ItemProcessor 가 비동기적으로 동작하는 구조AsyncItemProcessor 와 AsyncItemWriter 가 함께 구성이 되어야 함기본 처리 방식은 아래와 같다. JobStepItemReaderAsyncItemProcessor -> Item..
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴
2024.01.14강의 하나를 완강해야 겠다고 생각이 들었는데 빠르게 보고 싶은 강의가 생겼다. 강의 들으면서 정리도 겸하고 싶어 주저리 주저리 이 페이지에 옮겨놓으려고 한다. 조금 길어지면 2편으로 .. 로그 추적기 프로젝트에 병목이 생긴다면 로그를 통해 확인해봐야 한다. 아래 요구사항으로 로그를 개선하는 작업이다. 시간 정상호출 과 예외호출 구분 메서드 호출 깊이 구분 실제로 소스를 보면 알겠지만 로그 추적기 수정이 일어날 때마다 피처들에 대한 버전을 계속 관리해야 한다. 이 말은 로그 추적기를 달아야할 피처가 많아지면 많이질수록 그만큼 소스양이 나온다는 뜻..! 아래 구조에서는 traceId를 넘겨줘야 하는 구조여서 새 클래스를 생성할 때마다 의존관계도 계속 추가되고 그러면 응집도가 떨어지고 결합성이 높아질 수 밖에..
Criteria API
Criteria API
2023.01.28Criteria API란? 자바 ORM 표준 JPA 프로그래밍에서 JPQL(객체지향쿼리) Java Persistence Query Language 을 자바 코드로 작성할 수 있도록 도와주는 빌더 클래스 API를 의미합니다. JPQL 조회를 위한 문자열 빌드에 하나의 대안으로 Java 오브젝트를 갖는 조회 빌드 API 입니다. JPQL은 런타임 중에 잘못된것이 있는지 확인해볼 수 있습니다. Criteria API 장단점 장점 빌더 클래스로 컴파일 단계에서 문법 오류를 확인해볼 수 있습니다. 쿼리문을 문자열 그대로 작성 시 발생할 수 있는 휴먼 에러를 방지할 수 있습니다. 단점 코드가 복잡해지면 가독성이 떨어지게 됩니다. API 사용에 대한 러닝커브가 존재합니다. Criteria API 기본 쿼리 Crite..
의존성 주입
의존성 주입
2023.01.21의존성 주입이 필요한 이유 의존성 주입이 필요한 이유는 객체 간에 결합도를 줄일 수 있기 때문이다. 의존성 주입 방법 스프링에서 의존성 주입(DI)을 위한 4가지 방법을 제공한다. 생성자 주입 Setter 주입 필드 주입 메서드 주입 1. 생성자 주입 생성자를 통해 의존 관계를 주입할 수 있는 방법이다. 이 방법은 생성자 호출시점에서 1번만 호출되는것이 보장된다. 불변인 상태에서 사용할 수 있다. @Component public class quackServiceImpl implements diService { private final QuackRepository quackRepository; @Autowired public quackServiceImpl(QuackRepository quackReposit..
Spring Security
Spring Security
2021.12.14스프링 시큐리티 JWT는 JSON 객체로 안전하게 전송하기 위해 사용한다. header, payload, signiture 구성을 갖는다. base64로 각각 인코딩에서 클라이언트에 돌려준다. 이는 데이터의 무결성을 보장하기 위해 base64로 사용한다. 디코딩해서 확인할 수 있다. 클라이언트가 서버에 요청을 할때 JWT가 신뢰할 수 있는 토큰인지 검증하는데 서버는 header, payload, signiture를 알고있다. JWT가 유효한지 검증하는데 header랑 payload 그리고 서버가 가지고 있는 secret key를 가지고 HMACSHA 256으로 암호화해서 (직접 할 필요는 없다. 스프링 시큐리티에 관련 라이브러리가 존재한다.) 이 값을 클라이언트에 요청한것과 같으면(서명된 부분) 이전에 ..
빈 생명주기 & 콜백
빈 생명주기 & 콜백
2021.12.14빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 여기서 초기화 작업은 의존 관계 주입이 모두 완료되고 나서 호출이 되어야 한다. 개발자는 이 호출 시점을 알고 있어야 한다. 어떻게 파악할 수 있을까? 스프링에서는 의존 관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공해준다. 스프링 빈의 이벤트 라이프사이클은 아래와 같다. 생성 > 스프링 빈 생성 > 의존관계 주입 > 초기화 콜백 사용 > 소멸전 콜백 스프링 종료 초기화 콜백을 사용하는것은 빈이 생성되고 빈의 의존관계 주입이 완료..
의존관계 자동 주입
의존관계 자동 주입
2021.12.13의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입, 수정자 주입(setter 주입), 필드 주입, 일반 메서드 주입 생성자 주입은 생성자 호출 시점에 딱 1번만 호출된다. 불변하다. 이와 대비되게 set으로 열어두면 변경사항이 발생하기 때문에 버그각 발생할 가능성이 있다. 생성자가 1개 일 경우 @Autowired를 생략해도 자동 주입 된다. Test 코드 작성 시 등록된 클래스 구체 타입을 AnnotationConfigApplicationContext에다 넘겨주고 getBean 으로 빈을 꺼내온 후에 테스트하고자 하는 구체 타입과 똑같은지 비교하게 된다. 선택적으로 변경 가능성이 있는 의존관계에서는 주입할때 @Autowired(required=false) 를 적용할 수 있다. 자바빈 프로퍼티 규약..
컴포넌트 스캔
컴포넌트 스캔
2021.12.12컴포넌트 스캔 등록해야 하는 @Bean이 많아지면 프로그래머는 굉장히 힘들것이다. 누락될 수도 있고 자동으로 @Bean을 등록해주는 @ComponentScan 기능이 있다. 이런 경우 보통 클래스를 @Component으로 등록하고 각 메소드에 대한 의존관계를 위해 @Autowired를 등록해준다. @ComponentScan을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록된다. 그래서 이러한 의존관계 중 일부를 제외하고 싶다면 excludFilters를 사용해서 컴포넌트 스캔 대상에서 제외시킨다. @ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다 package hello.core; import org.springframework.con..
싱글톤 컨테이너
싱글톤 컨테이너
2021.12.12웹 애플리케이션과 싱글톤 트래픽이 들어왔을 때 같은 리소스를 여러 트래픽에서 호출하면 각각에 대해 객체가 생성될것이다. TPS가 커질 수록 문제가 발생한다. 순수 자바 코드의 경우 DI 컨테이너인 AppConfig는 요청할 때마다 객체를 새로 생성한다. 이런 경우 메모리의 낭비가 굉장히 심해진다. 그래서 고안된것이 싱글톤 패턴이다. private static final SingletonService instance = new SingletonService(); 그런데, 위와 같이 코드를 작성하면 어떤 문제가 발생할까? 보통 생성된 싱글톤을 호출하게 되면 .getInstance()를 쓰게 된다. getInstance()를 쓰게 되면 클라이언트는 구체 클래스 getInstance()에 의존하게 된다. 이는 ..
객체 지향 원리 적용
객체 지향 원리 적용
2021.12.10애자일 소프트웨어에 인상적인 글귀 - "계획에 따르기 보다는 변화에 대응하기를" Mac 기준으로 Method쪽에 CMD+SHIFT+T 를 누르면 Test 코드를 작성할 수 있다. Test 코드 작성 시 꿀팁은 given, when, then given 에 객체를 만들어주고 when 에 테스트 로직을 추가하고 then 에서 마지막으로 검증해준다. Test 코드에서 고려해야할 것은 성공, 실패 코드 두가지 이다. class RateDiscountPolicyTest { RateDiscountPolicy discountPolicy = new RateDiscountPolicy(); @Test @DisplayName("VIP는 10% 할인이 적용되어야 한다.") void vip_o() { //given Member..
Spring 예제
Spring 예제
2021.12.10Spring Spring build 할 때 프로퍼티에서 gradle보다 intellij를 쓰는것이 더 빠르다. Client에서 회원서비스를 통해 인터페이스에서 회원 저장소오아 연동될 DB를 구현한다. 예를들어서, MemberService 인터페이스를 구성하고 구현체로 MemberServiceImpl을 구현한다. 개발자가 구체적인 클래스 다이어그램을 구현한다. Spring에서 프로그래밍 처리하다보면 동시성 이슈가 생길 수 있기 때문에 Concurrent 를 고려해야한다. 아래 코드를 확인해보면 MemberRepository는 인터페이스이고 실제 구현은 MemoryMemberRepository에서 수행한다. 여기서 구현체가 존재하지 않는다면 NullPointException이 발생한다. private fin..
객체지향 설계와 스프링
객체지향 설계와 스프링
2021.12.09스프링 생태계 스프링 데이터 JPA, 세션, 시큐리티, 배치 등 웹기술 스프링 MVC, Webflux 데이터 접근 기술 트랜잭션, JDBC, ORM 스프링 부트의 장점 스프링과 3rd party 라이브러리 자동 구성을 지원한다. (외부 라이브러리 버전을 일일이 맞춰주지 않아도 Spring boot 그 역할을 수행한다.) 그래서 스프링이 무엇일까? 자바 언어 기반의 프레임워크이고, 객체 지향 프로그래밍이다. 즉, 객체지향을 기반으로 개발할 수 있도록 도와주는 프레임워크라고 볼 수 있다. 좋은 객체지향 프로그래밍이란? 객체들의 모임을 파악한다. 프로그램을 유연하고 변경 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 활용된다. 마치, 레고 블록 조립하듯이 사용할 수 있다. 객체 지향의 꽃이라 볼 수 있..