전체 글

전체 글

    Spring Envers 로 자동 이력 관리

    @EnableJpaAuditing 설정 클래스에 적용 함으로써 JPA 이력관리를 사용하도록 설정한다. @Audited @Audited(withModifiedFlag = true) @Entity public class Person { @Id @GeneratedValue private Long id; @Embedded private AuditMetadata auditMetadata; } @Embeddable public class AuditMetadata { @CreatedBy private Integer registeredBy; @CreatedDate private LocalDateTime registeredAt; @LastModifiedBy private Integer updatedBy; @LastMod..

    JPA @ElementCollection

    @ElementCollection @Entity 가 아닌 기본 자바 클래스나 @Embeddable 클래스로 정의된 컬렉션을 다루며, OneToMany 의 관계를 갖는다. @Entity public class Sample extends AbstractAggregateRoot { @Id @GeneratedValue private Long SampleNo; @ElementCollection private Set tags = new HashSet(); @ElementCollection @CollectionTable(name = "SampleScore", joinColumns = @JoinColumn(name = "SampleNo")) private List scores = new ArrayList(); } @E..

    Spring Event

    Spring Event 특정 이벤트를 발행(publish) 하면, 해당 이벤트가 발행되기를 대기하고 있던 리스너가 실행된다. 이벤트 발행 클래스와 리스너 클래스간 코드 의존성이 없다. 리스너 실행을 비동기로 실행할 수 있다. 이벤트 클래스 public class CustomEvent extends ApplicationEvent { @Getter private String message; public CustomEvent(Object source, String message) { super(source); this.message = message; } } ApplicationEvent 를 상속받는다. super 생성자를 반드시 실행해 줘야 한다. 이벤트 발행자(publisher) 클래스 @RequiredA..

    Spring 메소드 실행 실패시 재실행

    Spring Retry 메서드가 실패 하였을때 재 실행 할 수 있도록 도와주는 Spring AOP의 일종 이다. 네트워크 호출과 같은 일시적 문제가 있을 경우 사용한다. build.gradle Dependency 추가 implementation group: 'org.springframework.retry', name: 'spring-retry', version: '1.3.1'Retry 사용이 가능하도록 annotation 설정 @EnableRetry @SpringBootApplication public class RanchatApplication { public static void main(String[] args) { SpringApplication.run(..

    java annotation

    어노테이션은 기본적으로 메타 어노테이션으로 구성되어 있다. 메타 어노테이션 @Retention 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정 종류 RetentionPolicy.SOURCE - 컴파일 전까지만 유효하고 컴파일 하면 사라진다. RetentionPolicy.CLASS - 컴파일러가 클래스를 참조할때 까지만 유효하다. (class파일 에서도 존재는 하지만, invisible옵션을 통해 런타임 메모리에서는 제거됨) RetentionPolicy.RUNTIME - 런타임에도 어노테이션이 유효하므로 reflection사용 가능 @Target 어노테이션이 적용될 수 있는 위치를 선택하는 메타 어노테이션 종류 ElementType.PACKAGE ElementTy..

    Spring Rest Docs 사용법

    Spring Rest Doc?? 기존에 사용하던 Swagger는 소스코드의 작동과는 연관이 거의 없기 때문에, 로직이 변경 되더라도 api 명세 어노테이션 등을 변경해주지 않으면 최신화가 되지 않는 문제가 있다. Spring Rest Docs 를 이용하면 반드시 테스트코드가 통과 해야 문서가 생성된다.(asciiDoc 이 생성) 따라서 api 문서의 정확성이 보장된다. asciiDoc?? markdown 과 같이 특정 표현식을 통해 문서를 작성하는 도구이다. 개인적인 생각으론 markdown 에 비해 사용성은 불편하지만, include와 같은 기능을 통해 api명세를 만들기엔 좋은 것 같다. (markdown이 include를 지원하게 되면 markdown 이 더 좋을듯...) RestDocs를 사용하기..

    Jackson 어노테이션 정리

    jackson은 기본적으로 프로퍼티 기반이므로 getter, setter 에 적용된다. @JsonProperty 해당 필드를 프로퍼티로 적용한다. json으로 변환시 키값 표기를 변경할 수 있다. @JsonProperty(value="member_id") String memberId; @JsonIgnore 어노테이션이 적용된 필드는 JSON변환시 적용되지 않는다. @JsonInclude 클래스 레벨에서 json변환에 사용될 설정을 추가할 수 있다. @JsonInclude(JsonInclude.Include.ALWAYS) public class Member { .... } JsonInclude.Include.ALWAYS: 모든 값을 json변환시 포함한다. JsonInclude.Include.NON_NUL..

    Spring Batch

    1. Job은 하나의 배치 작업 단위를 얘기한다. 2. 하나의 Job은 여러개의 Step을 가지고 있다. 3. step 은 tasklet 이나 reader, processor, writer 묶음을 가지고 있을 수 있다. tasklet 과 reader, processor, writer 묶음은 같은 레벨이므로 reader > processor > tasklet 등으로 끝낼 순 없다. 4. reader, processor, writer 묶음으로 처리하는 방식을 chunk 지향 처리 방식 이라 한다. 5. ItemReader, ItemProcessor, ItemWriter 를 구현하여 각 컴포넌트 를 작성 해야 한다. stepBuilderFactory.get("name") .chunk(2) .reader(rea..

    JPA 캐시

    캐시 기본적으로 영속성 컨텍스트를 1차 캐시라고 한다. 애플리케이션 범위의 2차 캐시가 있다.(공유캐시) 영속성 컨텍스트에 존재하지 않으면 2차 캐시를 조회한다. 2차캐시에도 엔티티가 없으면 데이터베이스를 조회해서 2차 캐시에 보관한다. 2차 캐시는 자신이 보관하고 있는 엔티티를 복사해서 반환한다. 2차캐시에서 얻어온 객체는 영속성 컨텍스트가 다르면 동일성(a==b)를 보장하지 않는다. @Cacheable @Entity public class Member { .... } 애플리케이션 전체에 캐시를 어떻게 적용할지 shared-cache-mode 를 설정 해줘야 한다. (EntityManagerFactory) SharedCacheMode 설정 종류 ALL: 모든 엔티티를 캐시한다. NONE: 캐시를 사용하..

    JPA 락 처리

    락 제어 트랜잭션 격리수준 4가지 READ UNCOMMITTED = DIRTY READ, NON-REPEATABLE READ, PHANTOM READ 발생 READ COMMITTED = NON-REPEATABLE READ, PHANTOM READ 발생 REPEATABLE READ = PHANTOM READ 발생 SERIALIZABLE DIRTY_READ : 트랜잭션 1이 수정중이고, 커밋하지 않은 데이터를 트랙잭션2가 조회 가능한 것 NON-REPEATABLE READ: 트랜잭션 1이 A를 조회하고, 다른작업을 진행중에 트랜잭션 2가 A를 수정하여, 트랜잭션1이 다른작업 후 다시 A를 조회했을때 다른 테이터가 조회되는 것. PHANTOM_READ: 트랜잭션 1이 10살 이하 회원을 조회 하였을때 카운트가..