분류 전체보기

    [JPA] OSIV와 Spring Framework에서의 OSIV에 대해서

    OSIV와 Spring Framework에서의 OSIV에 대해서 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 트랜잭션이 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 보통 비즈니스 로직을 시작하는 서비스 계층에 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다. 이 어노테이션으로 인해 트랜잭션 AOP가 동작을 하고, 트랜잭션을 커밋하면 JPA는 flush로 변경 내용을 데이터베이스에 반영한 후에 데이터베이스 트랜잭션을 커밋한다. 예외 발생 시에는 트랜잭션을 롤백하고 종료한다. 이 때에는 flush를 호출하지 않는다. 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다. 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다..

    [Spring] @Async를 이용한 비동기 처리에 대해

    @Async 를 이용한 비동기 처리에 대해 @Async 는 비동기적으로 처리를 할 수 있게끔 스프링에서 제공하는 어노테이션이다. 해당 어노테이션을 붙이게 되면 각기 다른 쓰레드로 실행이 된다. 즉, 호출자는 해당 메서드가 완료되는 것을 기다릴 필요가 없다. 이 어노테이션을 사용하기 위해서는 @EnableAsync 가 달려있는 configuration 클래스가 우선적으로 필요하다. @Configuration @EnableAsync public class AsyncConfig { } By default, both Spring's @Async annotation and the EJB 3.1 @javax.ejb.Asynchronous annotation will be detected. -@EnableAs..

    쿼리 튜닝 미션 적용기

    쿼리 튜닝 미션 적용기 우테코 레벨 4의 새로운 미션으로 쿼리 최적화 미션이 나왔다. 이 적용기를 써보려 한다. 허접함 주의!!!! 쿼리가 그렇게 좋지 않습니다!!! 모수 테이블이 작아야 한다는 원칙도 잘 지키지 못했다!! 그냥 과정만 봐주세요 ㅎㅎ.. 연습 쿼리로 위의 요구사항이 주어졌다. 테이블 정보는 다음과 같았다. 요구사항을 일단 되는대로 쿼리를 짜보았다. select 연봉높은사원신상.사원번호, 연봉높은사원신상.이름, 연봉높은사원신상.연봉, 사원출입기록.지역, 직급.직급명, 사원출입기록.입출입구분, 사원출입기록.입출입시간 from ( select 사원.사원번호, 사원.이름, 연봉사원정보.연봉 from 사원 inner join ( select 급여.사원번호, 급여. 연봉 from 급여 inner j..

    [Flyway] 간략히 알아보는 Flyway 적용법

    간략히 알아보는 FlyWay 적용법 FlyWay? DB Migration Tool 도입하게된 이유는? 진행 중인 프로젝트에서 spring.jpa.hibernate.ddl-auto 속성을 update을 이용했었는데 운영서버와 개발서버 간의 문제가 간간히 발생했고, create 속성으로 두기에도 데이터가 계속해서 날라가는 단점이 있었다. validate 으로 두고 진행하니, 운영서버와 개발서버를 나누고 있는 상황에서 한 쪽에만 DDL, DML을 적용되는 실수가 발생할 수 있기에 이를 쉽게 관리하기 위해 사용했다. 또한, 버전 기록이 남아있어 변경 내역을 확인할 수가 있다는 장점이 있다. 적용법 build.gradle 의존성 추가 dependencies { implementation 'org.flywa..

    [Spring] application.yml의 Profile에 대한 테스트 이것저것

    application.yml의 Profile에 대한 테스트 이것저것 Profile에 대한 개념이 있다는 가정하에 진행하겠다. 모른다면 !링크를 참고하자. application-{프로파일}.yml 은 특정 Profile에 맞는 yml 파일이다. Profile을 따로 지정하지 않고 실행하게 된다면 application.yml이 실행이 된다. 그렇다면 이때의 Profile은 무엇으로 실행되는 것일까?? Baeldung 싸이트 피셜로 'default' Profile 이라고 한다. 그렇다면 Profile을 지정하지 않고 돌렸는데 application.yml 이 없다면 어떻게 될까?? //application.yml person: name: defaultBepoz age: 100 //applicati..

    [Java] Atomic, Volatile, Synchronized 에 대해

    Atomic, Volatile, Synchronized 에 대해 멀티 쓰레드의 경우에 공유하는 필드에 대해서 thread-safe를 보장해주어야 한다. public static int idx = 0; 이런식으로 두는 것은 thread-safe 하지않다. Atomic, Volatile, Synchronized 에 대해 알아보자. public class CounterBasic { private static int idx = 0; public static int increase() { return idx++; } public static int idx() { return idx; } } public class CounterSynchronized { private static int idx = 0; public..

    [JPA] JPA CascadeType.PERSIST 에 대한 개인적인 궁금증 해결

    JPA CascadeType.PERSIST 에 대한 개인적인 궁금증 해결 Team과 Member와 같은 1:n의 연관관계를 처리할 때에 Team에 Member를 넣은 후 일일이 Member를 영속화하기 번거로우니 Team만 영속화시켜도 Member 또한 영속화되도록 하기위해 설정을 해준다. 이렇듯이 보통 1에서 n에 대하여 이 속성을 걸어주게된다. @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(ma..

    [Java] Reflection 사용법 정리

    Reflection 사용법 정리 클래스 객체 검색 Object.getClass(); class Bepoz { int value; public Bepoz(int value) { this.value = value; } } Bepoz bepoz = new Bepoz(10); Class aClass1 = Class.forName("reflection.Bepoz"); //Bepoz 클래스는 reflection 패키지 내부에 있음 기본 유형 래퍼의 TYPE 필드 Class type = Double.TYPE; Class type1 = Integer.TYPE; Class type2 = Void.TYPE; 클래스를 반환하는 메서드 public class Bepoz extends Parent { int value; pub..