SPRING
스프링 배치 - 아키텍쳐
Application 스프링 배치 프레임워크를 통해 개발자가 만든 모든 배치 JOB과 커스텀 코드 개발자는 업무로직의 구현에만 집중하고 공통적인 기반 기술은 프레임웤이 담당 Batch Core Job을 실행, 모니터링, 관리하는 API로 구성되어있음, JobLauncher, Job, Step, Flow등이 속함 Batch Infrastructure Application, Core 모두 공통 Infrastructure 위에서 빌드 Job 실행의 흐름과 처리를 위한 틀을 제공함 Reader, Processor, Writer, Skip Retry 등이 속함 출처 : 인프런 스프링배치(정수원)
[스프링 핵심 원리 - 고급편]인터페이스 ,클래스 기반의 프록시
인터페이스 기반 프록시 vs 클래스 기반 프록시 인터페이스가 없어도 클래스 기반으로 프록시를 생성할 수 있다. 클래스 기반 프록시는 해당 클래스에만 적용할 수 있다. 인터페이스 기반 프록시는 인터페이스만 같으면 모든곳에 적용할 수 있다. 클래스 기반 프록시는 상송을 사용하기 때문에 몇가지 제약이 있다. 부모 클래스의 생성자를 호출해야한다.(super()) 클래스에 final 키워드가 붙으면 상속이 불가능하다. 메서드에 final 키워드가 붙으면 오버라이딩 할 수 없다. 예제 소스 각 인터페이스 코드는 아래와 같다. @RequestMapping//스프링은 @Controller 또는 @RequestMapping이 있어야 스프링 컨트롤러로 인식할 수 있다. @ResponseBody public interfac..
[스프링 핵심 원리 - 고급편] 프록시, 프록시 패턴, 데코레이터 패턴
클라이언트와 서버 개념에서 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 대신 간접적으로 서버에 요청할 수 있다. 이것을 프록시라고 한다. 객체에서 프록시가 되려면, 클라이언트는 서버에 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 한다. (즉 서버와 프록시는 같은 인터페이스를 사용해야함) 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작해야한다. 프록시의 주요기능 프록시를 통해서 할 수 있는 일은 크게 2가지로 구분할 수 있다. 접근제어 권한에 따른 접근차단 캐싱 지연로딩 부가 기능 추가 원래 서버가 제공하는 기능에 더해서 부가 기능을 수행한다. 프록시 객체가 중간에 있으면 크게 접근 제어와 부가 기능..
[JPA]JPA,Hibernate, Spring Data JPA차이
JPA(Java Persistence API), 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 이다. 즉 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의한 방법일 뿐이다. Hibernate는 JPA의 구현체이다. JPA Hibernate EntityManagerFactory, ← - SessionFactory EntityManager ← - Session EntityTransaction ← - Transaction (상속) 위와 같이 상속받고 있고 각각을 Impl로 구현하고 있다고 볼수 있다. 즉 JPA를 사용하기 위해서 반드시 Hibernate를 사용할 필요가 없다는 것이다. Spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈 S..
[JPA] 연관관계
JPA가 사용하는 객체 연관관계 VS 테이블 연관관계의 차이 객체는 참조(주소)로 연관관계를 맺는다. 테이블은 외래 키로 연관관계를 맺는다. 연관된 데이터를 조회할때 객체는 참조를 하지만, 테이블은 조인을 한다. 참조를 통한 연관관계는 단방향 관계이며, 양방향으로 만들어도 사실상, 단방향관계가 2개이다. 💡 객체의 단방향 관계는 [Member.team](http://member.team) 필드를 통해서 팀을 알 수 있지만, team→ member를 접근하는 필드가 없으면 알 수가 없다. 만약 team에서도 알고 싶다면, Member라는 필드를 생성하며 Team.member를 통해 접근 할 수 있도록 양방향 관계를 맺어줘야 한다. public Static void main(){ Member member1 ..
[JPA]객체지향쿼리
JPQL JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않으며, SQL에 비해 간결하다. @Entity(name="MEMBER") public class Member{ @Column(name="name") private String username; } //사용 String jpql = "select m from Member as m where m.username = "kim" List resultList = em.createQuery(jpql, Member.class).getResultList(); 작성한 JPQL을 실행하려면 쿼리 객체를 만들어야 한다. 쿼리 객체는 TypeQuery와 Query가 있는데 반환할 타입을 명확하게 지정할 수..
[QueryDsl]
Querydsl 프로젝트 셋팅 .... ** com.querydsl querydsl-apt ${querydsl.version} provided com.querydsl querydsl-jpa ${querydsl.version} ** ... ** com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.querydsl.apt.jpa.JPAAnnotationProcessor ** spring: datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-a..
[스프링 핵심 원리-고급] 템플릿 콜백 패턴
다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백이라고 한다. 프로그래밍에서 콜백 또는 콜에프터 함수는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다. 자바 언어에서의 콜백 1. 자바 언어에서 실행 가능한 코드를 인수로 넘기려면 객체가 필요하다. 자바8부터는 람다를 사용할 수 있다. 2. 자바 8이전에는 보통 하나의 메소드를 가진 인터페이스를 구현했고, 주로 익명 내부 클래스를 사용했다. 3. 최근에는 주로 람다를 사용한다. 스프링에서의 템플릿 콜백 패턴(ex-> XxxTemplate) - JdbcTemplate, RestTemplate, TransactionTemplate, Redi..
[스프링 핵심 원리 -고급] 전략패턴
템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고 변하는 부분을 자식 클래스에 두어 상속을 사용함 전략 패턴은 변하지 않는 부분을 Context에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하여 문제를 해결. 상속이 아니라 위임으로 문제를 해결한다. @Slf4j public class ContextV1 { private Strategy strategy; public ContextV1(Strategy strategy) { this.strategy = strategy; } public void execute() { long startTime = System.currentTimeMillis(); //비지니스 로직 실행 strategy.call(); //비지니..
[스프링 핵심 원리-고급] 템플릿 메서드 패턴
변하는 것과 변하지 않는 것을 분리한다 좋은 설계는 변하는 것과 변하지 않는 것을 분리하는것 템플릿 메서드 패턴은 이런 문제를 해결하는 디자인 패턴이다. 템플릿 메서드 패턴은 이름 그대로 템플릿을 사용하는 방식, 템플릿은 기준이 되는 거대한 틀이다. 템플릿이라는 틀에 변하지 않는 부분은 몰아둔다. 그리고 일부 변하는 부분을 별도로 호출해서 해결한다. 템플릿 메서드 디자인 패턴의 목적 - 작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 정의할 수 있다. 예제 코드 생성 @Slf4j public class TemplateMethodTest { @Test void templateMethod..