본문 바로가기

Spring

(12)
[Spring] JPA hibernate의 ddl-auto 속성 JPA의 구현체 중 하나인 하이버네이트는 다양한 기능을 제공하는데,그 중 엔티티만 작성해놓으면 자동으로 테이블을 생성하거나 수정해주는 ddl-auto 라는 설정이 있다.create, create-drop, update, validate, none 이렇게 속성이 있는데, 여기서는 create과 update에 대해서만 작성한다.createcreate은 애플리케이션을 실행할 때마다 테이블을 자동으로 생성해준다.실행 시 데이터베이스에 해당 테이블이 존재하지 않으면 새로 테이블을 생성하고, 이미 테이블이 존재한다면 drop 후 다시 생성한다. 하지만 이 옵션은 기존의 데이터가 모두 삭제되고 새로운 테이블이 생성되기 때문에, 실제 운영 환경에서는 절대 사용하면 안된다고 한다.updateupdate도 실행 시 해당 ..
[Spring] @Profile로 활성 프로파일 지정하기 개발을 하다 보면 여러 개의 환경을 관리해야 한다. 예를 들어 테스트 코드를 위한 테스트 환경, 개발을 하고 테스트를 하기 위한 로컬 환경, 실제 서비스가 운영되는 배포 환경 등이 있다.그렇기 때문에 각각의 환경들에 맞게 서로 다른 빈 또는 프로퍼티들을 정의해야 할 수도 있다. 예를 들어, 배포 환경에서는 S3Service가 필요하겠지만개발이나 테스트 할 시에는 계속 S3에 업로드 되는 것이 비용적으로 부담이 될 수도 있고 매번 S3를 실행시키는 것이 불필요할 수도 있다. 이를 위해, Spring은 3.1부터 환경에 따라 서로 다르게 빈을 정의할 수 있도록 환경을 분리하는 기술을 제공하는데, 이것을 @Profile이라고 한다. Spring의 다중 Profile을 사용하면 환경을 바꿀 때마다 번거롭게 매번..
[Spring] 트랜잭션 격리수준 트랜잭션 격리수준동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 격리되어 있는 지 수준을 말한다.격리성을 강화시키면 다른 트랜잭션이 끼어들지 못하게 보장할 수 있고, 약화시키면 다른 트랜잭션도 중간에 끼어들 수 있다. 준수한 처리 속도를 위해서는 트랜잭션의 완전한 격리가 아닌 완화된 수준의 격리가 필요하다.  이처럼 속도와 데이터 정확성에 대한 트레이드 오프를 고려하여 트랜잭션의 격리성 수준을 나눈 것이 바로 트랜잭션의 격리수준이다.트랜잭션 ACID1. Atomicity 원자성한 트랜잭션의 연산은 모두 성공하거나, 모두 실패해야 한다. 예를 들어, 돈을 이체할 때 돈을 빼오는 작업만 성공하고, 돈을 넣는 작업은 실패하면 안된다. 2. Consistency 일관성트랜잭션 처리 후에도 데이터의 상태는..
[Spring] Spring Security 동작 원리, 왜 사용하는 지 Spring SecuritySpring 기반 애플리키이션의 보안을 담당하는 프레임워크다.인증, 인가, 응답 등 보안에 관련하여 많은 기능을 제공하고 있기 때문에 개발자가 하나하나 보안에 관련된 코드를 짜지 않아도 되는 장점이 있다.대부분 우리는 Spring Security를 로그인 유지/페이지 권한 등에 사용한다인증(Authentication): 사용자가 본인인지 확인하는 절차(로그인)인가(Authorization): 인증된 사용자가 요청한 경로에 권한이 있는지 결정하는 절차접근주체(Principal): 권한이 있어야 접근 가능한 경로에 접근하려고 하는 사용자비밀번호(Credential): 경로에 접근하려고 하는 사용자의 비밀번호 (접근주체의 비밀번호)동작 원리1. 요청사용자가 로그인 정보..
[Spring] Spring의 DI: 생성자 주입 vs 필드 주입 결론부터 말하면 생성자 주입이 더 좋다. 스프링 공식 문서에서도 생성자 주입 사용하는 것을 권고하고 있다. 생성자 주입 @RestController @RequiredArgsConstructor public class Example { private final HelloService helloService; } 필드 주입 @RestController public class Example { @Autowired private HelloService helloService; } 생성자 주입이 더 좋은 이유 1. 순환 참조 방지 순환 참조가 발생할 경우 애플리케이션 자체가 구동되지 않아서 사전에 오류를 방지할 수 있다. 필드 주입같은 경우는 순환 참조가 발생해도 구동한다. (메소드 실행 시점까지 되어야 서버 꺼..
[Spring] DAO, DTO, VO 차이 DAO DB의 데이터에 접근하기 위한 객체. 실제로 DB에 접근하여 데이터를 삽입, 삭제, 조회, 수정 등 CRUD 기능 수행한다. Repository라고 보면 된다. DTO 계층 간 데이터 교환을 하기 위해 사용되는 객체로, DTD는 비즈니스 로직을 가지지 않는 형태이다. 데이터를 담는 그릇의 역할. DTO에는 getter/setter 메소드만 존재한다. DB에서 데이터를 얻어서 Service나 Controller 등으로 보낼 때 사용한다. VO VO는 DTO와 달리 Read-Only 속성을 가진 값 오브젝트이다. VO의 경우 getter만 가지고 있어 수정이 불가능하다. DTO는 인스턴스 개념이고, VO는 리터럴 값 객념이다. VO는 두 객체의 모든 필드 값들이 동일하면 두 객체는 같다. DTO와 V..
[Spring] Spring MVC 동작 원리 클라이언트가 요청을 서버에 전송하면, DispatcherServlet이라는 클래스에게 요청이 전달된다. DispatcherServlet은 클라이언트 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청. HandlerMapping은 클라이언트 요청에 해당하는 컨트롤러를 찾고 해당 컨트롤러 정보를 다시 DispatcherServlet에게 응답한다. 요청을 처리할 Controller를 찾았으니 이제 클라이언트 요청을 처리할 Handler 메서드를 찾아서 호출해야 한다. DispatcherServlet은 Handler 메서드를 직접 호출하지 않고 HandlerAdapter에게 Handler 메서드 호출 책임을 넘긴다. HandlerAdapter은 DispatcherSe..
[Spring] 스프링 JPA 정리 ORM 자바의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑시켜주는 프로그래밍 기법 직접 SQL문을 사용하지 않고 자바 코드를 사용해서 DB에 접근할 수 있는 기술이다. JPA 자바에서 ORM 기술 표준으로 사용되는 인터페이스 모음. 실제로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해서 사용되는 프레임워크. 말그대로 인터페이스기 때문에 구현체가 없다. Hibernate JPA 인터페이스의 구현체의 한 종류. 내부적으로 JDBC 이용 아래 그림 참고하자. Spring Data JPA JPA의 기능을 기반으로 제작된 라이브러리다. JPA에서 Repository를 제작할 때마다 반복적으로 작성되는 CRUD 메소드를 제공하는 라이브러리. 사용 방법 public interface DataJpaRe..