Spring 처음 시작할 때 설정
·
Java/Spring
1. spring 설정 initializrhttps://start.spring.io/ gradle - java - 최신버전 - 그룹명(회사명) - 이름(애플리케이션 명) dependenciesSpring Data JPA : JPA와 Data JPA가 동시에 의존성 주입됨lombok : getter나 setter와 같은 개발자들에게 반복되는 코드들을 줄여주는 툴사용하는 DB : DB 의존성을 가져와야 연결 가능Spring Web : Apache Tomcat을 이용해 Spring MVC 애플리케이션을 만들어주는 의존성 generate - 압축 풀기 - ide에서 build gradle 파일 open  2. build 속도 향상 설정settings - build 검색 - Gradle - Build and Ru..
Fetch Join(1) - 개요 및 Join과의 차이점
·
Java/Spring
Fetch Join은 N+1문제를 해결하고 성능을 향상시킬 수 있는 기능이다. 오늘은 어떻게 Fetch Join이 성능을 향상시키는지 알아보자. 우선 Fetch Join에 대해서 정리하고 가야할 것이 있는데 Fetch Join은 DB에서 지원하는 기능이 아닌 JPA의 JPQL에서 제공하는 기능이다. 그렇다면 Join에서 어떤 것이 부족해서 Fetch Join이라는 함수를 따로 만들었을까? 이는 객체와 테이블을 맵핑하려는 데에서 파생된 문제에서 시작되었다. 아래와 같은 Member와 Team이라는 테이블이 있다고 하자.  Member는 Team과 다대일의 관계를 가지고 있다. 만약 Member 전체를 조회하는 JPQL을 짠다면 Team의 ID, 이름, 나이가 영속성 컨텍스트에 저장되고 Team 엔티티는 조..
Reflection API와 하이버네이트(feat. JPA 전신)
·
Java/Spring
JPA에서 DB의 데이터를 객체로 어떻게 맵핑하나 공부하다보면 리플렉션에 대해서 알게된다.오늘은 이 리플렉션에 대해서 알아보겠다. 참고로 하이버네이트는 JPA가 Spring 진영의 공식 ORM이 되기 전에 있었던 오픈소스 ORM 라이브러리 이름이다. JPA를 공부하다보면 하이버네이트의 흔적이 곳곳에서 보이곤한다. 자바 리플렉션 API는 클래스의 메타데이터(구조)를 분석하여 private 접근제어를 무너뜨리고 데이터를 직접 주입할 수 있다. 자바 가상 머신(JVM)은 클래스를 실행할 때 해당 클래스의 모든 정보(필드 이름, 타입, 메서드 등)를 메모리의 메서드 영역(Method Area)에 저장해둔다. 일반적인 컴파일에서는 접근제어권한을 풀 수 없지만 리플렉션은 런타임에 메모리에 저장된 클래스 정보 자체를..
트랜잭션(@Transaction) (2) - 트랜잭션 옵션
·
Java/Spring
트랜잭션 옵션value, transactionManager코드로 직접 트랜잭션을 적용할 경우 트랜잭션 매니저를 주입받아서 사용해야 했다. 어노테이션으로 트랜잭션을 적용할 때도 동일하게 지정해줘야 한다. 다만 이 값이 생략되었을 경우 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략하여 사용한다.트랜잭션 매니저를 별도로 지정해주는 경우는 사용하는 트랜잭션 매니저가 둘 이상이어서 구분할 때 보통 사용한다.public class TxService { @Transactional("memberTxManager") public void member() {...} @Transactional("orderTxManager") public void order() {...}}  rollbackFor예외 발..
트랜잭션(@Transaction) (1) - 트랜잭션의 개요 및 프록시 내부 호출 문제
·
Java/Spring
트랜잭션이란?데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 메소드에 트랜잭션을 적용시키면 메소드가 수행하는 작업의 단위가 된다. 메소드 실행 중에 생기는 쿼리들은 프록시 객체에 저장되고 완료되면 기존 객체와 변화한 점을 확인 후 데이터베이스에 한꺼번에 커밋한다.   스프링 트랜잭션 사용 방식 선언적 트랜잭션 관리 vs 프로그래밍 방식의 트랜잭션 관리선언적 트랜잭션 관리 : @Transaction 어노테이션 하나만 선언해서 트랜잭션을 적용하는 것프로그래밍 방식의 트랜잭션 관리 : 트랜잭션 매니저 또는 트랜잭션 템플릿 등을 사용해서 트랜잭션 관련 코드를 직접 작성하는 것  프로그래밍 방식의 트랜잭션 관리를 사용하게 되면 애플리케이션 코드가 트랜잭션 코드와 강하게 결합된다.그리고 선언적..
그거 아셨나요? - 체크 예외(Check Exception)
·
Java/Spring
체크 예외란?RuntimeException 클래스를 상속받지 않은 예외 클래스들을 말합니다. 체크 예외는 복구 가능성이 있는 예외이므로 반드시 예외를 처리하는 코드를 함께 작성해야 합니다. 예외를 처리하기 위해서는 catch 문으로 잡거나 throws를 통해 메소드 밖으로 던질 수 있습니다. 예외를 처리하지 않으면 컴파일 에러가 발생합니다. 반대로, 언체크 예외가 있습니다. RuntimeException 클래스를 상속받는 예외 클래스들은 복구 가능성이 없는 예외들이므로 컴파일러가 예외처리를 강제하지 않습니다. 즉, 에러를 처리하지 않아도 컴파일 에러가 발생하지 않습니다. 런타임 예외는 예상치 못했던 상황에서 발생하는 것이 아니므로 굳이 예외 처리를 강제하지 않습니다. RuntimeException에는 대..
Spring @어노테이션
·
Java/Spring
Spring 프레임워크에서 쓰이는 어노테이션을 정리해보았다. @RequiredArgsConstructorfinal이 붙은 필드로 생성자를 하나 만들어준다.그리고 생성자가 하나만 있으면 @Autowired가 자동으로 붙는다.그래서 생성자와 @Autowired를 생략하여 코드를 깔끔하게 정리할 수 있다. @Transactional데이터베이스 상태를 바꾸는 쿼리들이 많이 있을 때, 중간에 오류가 나서 멈추게 되면 그동안 바꿨던 쿼리들을 되돌려야 할 것이다. 트랜잭션을 사용한 메소드는 쿼리들을 프록시 저장했다가 최종적으로 완료되면 커밋된다. 트랜잭션에 대해서 간단히 설명했지만 다루는 내용이 많다. 나중에 별도로 게시물을 만들어보겠다.   스프링 IoC(Inversion of Control) 관련 어노테이션스프링..
Spring - 스프링 빈
·
Java/Spring
스프링 빈은 어디에 활용하는 것일까?객체지향언어를 배우다보면 싱글톤 객체를 만들어 필요한 곳마다 찾아넣어주는 의존성 주입을 구현해본 적이 있을것이다.이것을 간단화할 수 있는 @Autowired에 활용된다.생성자에 @Autowired 어노테이션이 있다면 스프링이 연관된 객체는 스프링 Container가 찾아서 넣어준다.  스프링 빈을 등록하는 방법컴포넌트 스캔과 자동 의존관계 설정자바 코드로 직접 스프링 빈 등록하기스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 싱글톤으로 등록한다. 즉, 스프링 빈을 의존성 주입 받으면 모두 같은 인스턴스이다. 설정으로 싱글톤이 아니게 할 수 있지만 대부분 기본값인 싱글톤을 사용한다.  1. 컴포넌트 스캔@Component 어노테이션이 있다면 스프링 빈으로 자동 등록되는..