본문 바로가기

스프링

(12)
@Transactional 오늘은 @Transactional 어노테이션에 대해 정리해보려한다. 우선 @Transactional 어노테이션을 사용하려면 트랜잭션에 대해 알아야할 필요가있다. 트랜잭션이란? 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업 단위나 한번에 수행되어야할 일련의 연산을 의미한다. 특징으로는 Database시스템에서 병행제어 및 회복 작업이 수행될 때 처리되는 작업의 논리적 단위로 사용자가 어떤 서비스를 요청할 때 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다. 각 트랜잭션은 commit 혹은 rollback되어야한다.(원자성 보장) 1. 원자성 (Atomicity) 각 트랜잭션은 commit 혹은 rollback되어야한다. 트랜잭션 안에서의 모든 명령은 완벽하게 수행되어야하고,..
Interceptor와 filter의 차이 필터(Filter) 서블릿이나 정적 내용같은 자원 요청이나, 응답에 대해 필터링 작업을 수행하는 객체이다. 필터는 Web Application에 등록하고 요청 스레드가 서블릿 컨테이너에 도착하기 전에 수행되며, 필터는 사용자의 요청 정보에 대한 검증하고 필요에 따라 데이터를 추가하거나 변조할 수 있다. 주로 전역적으로 처리해야하는 인코딩, 보안 관련 일을 수행한다. 사용예시 오류 처리 기능 인코딩 처리 기능 웹 보안 관련 기능 처리 데이터 압축이나 변환 기능 요청이나 응답에 대한 로그 로그인 여부, 권한 검사 같은 인증 기능 필터 구현 예시 @Slf4j public class TestFilter implements Filter { private final String value; public TestFi..
@Controller와 @RestController 차이 스프링에는 컨트롤러를 지정해주기 위한 어노테이션으로 @Controller와 @RestController가 있다. @RestController는 @Controller와 @RestponseBody의 조합이며, RESTful 웹서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었다. 주요한 차이점은 HTTP Response Body가 생성되는 방식이 다르다는 것이다. @Controller의 역할은 Medel 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터를 JSON 또는 XML형식으로 HTTP응답에 담아서 전송한다. @Controller와 @ResponseBody를 사용해서 만들 수 있지만 이러한 방식은 RESTful ..
Domain(Entity) / DTO / DAO Entity 실제 DB 테이블에 대응하는 하나의 클래스로, DB의 테이블 내에 존재하는 컬럼만을 필드로 가져야한다. Entity클래스는 도메인이라고 하며 가장 DB와 가까운 클래스이다. 상속 받거나 구현체여서는 안되고, 테이블 내에 존재하지 않는 컬럼을 가져서도 안된다. 최대한 외부에서 Entity 클래스의 getter method를 사용하지 않도록 해당 클래스 안에서 필요한 로직 method를 구현해야한다. DTO(Data Transfer Object) 계층간 데이터 교환을 위한 객체로 DB에서 얻은 데이터를 Controller나 Service 로직에서 사용하기 위한 객체이다. 로직을 가지고 있지않은 수순한 데이터 객체로 getter/setter 메서드만 갖는다. (DB에서 꺼낸 값을 임의로 변경할 필..
JPA 연관 관계 정리 / @OneToMany 단방향의 단점 기존의 데이터베이스에서는 외래 키(FK)를 사용하나 객체로 표현하기 어려운 데이터 간의 관계를 위해 JPA에서는 객체를 참조하는 방식으로 연관관계를 매핑할 수 있다. 연관관계 매핑 시 고려사항 3가지 다중성 다대일 [N:1] : @ManyToOne 일대다 [1:N] : @OneToMany 일대일 [1:1] : @OneToOne 다대다 [N:M] : @ManyToMany 방향 단방향 양방향 : 양방향 관계는 없고 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용하는 것. 연관관계의 주인 FK(외래 키) 하나로 두 개의 테이블이 연관관계를 맺는다. 연관관계의 주인: 외래 키를 관리하는 참조 양방향 관계는 참조가 2개라 연관 관계인 두 개의 테이블 중 외래 키를 관리하는 곳을 지정해야 한다. 연관관계..
Annotation - @Entity Entity 데이터 베이스에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터를 말한다. 하나의 엔티티는 하나의 테이블이라 생각하면 된다. ※영속적 : 영구적으로 저장해준다. 말 그대로 메모리 영역이 아닌 물리 데이터 저장공간에 저장되어 앱이 종료되더라도 데이터가 사라지지 않고 남아있음을 의미 Entity 제약조건 엔티티 도메인 클래스를 작성할 때는 제약조건이 존재한다. 1. 클래스에 반드시 @Entity 어노테이션이 정의되거나, xml에 작성되어야한다. @Entity public class User{ ... } 2. no-arg(파라미터가 없는) 생성자를 가지고 있어야 한다. Hibernate에서는 리플렉션으로 엔티티 객체를 생성하기 때문에 모든 Entity는 no..
Spring Bean Bean의 개념과 생성원리에 대해 알아보자. Bean이란? IoC컨테이너가 관리하는 자바객체를 부르는 용어로 IoC 컨테이너에 의해 인스턴스화, 관리, 생성된다. new연산자로 객체를 생성했을 때는 Bean이 아니며, ApplicationContext.get()으로 얻을 수 있는 객체를 말한다. Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다. Bean은 보통 Singleton으로 존재한다. 싱글톤패턴 : 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴 생성방식 Component Scanning IoC 컨테이너를 만들고 그 안에 Bean을 등록할 때 사용하는 인터페이스들을 Life Cycle Callback이라 부른다...
[SpringBoot] PasswordEncoder 적용하기 오늘 간단히 회원가입로직을 짜면서 패스워드 암호화를 진행해보았다. 비밀번호 암호화 왜 필요할까? 당연한걸 고민한다고 생각할지도 모른다. 비밀번호가 노출된다하더라도 서버에 중요한 정보가 없다면 문제가 안될수도 있다. 하지만 여러 웹사이트의 비밀번호를 동일하게 사용하는 유저라면 얘기가 달라진다. 한 사이트에서 비번이 유출된다면 이 사람이 가입된 모든 사이트가 해킹된 셈이다. 그래서 비밀번호 암호화를 해놓으면 서버가 해킹당해서 패스워드가 유출된다하더라도 해당 사용자의 이메일로 가입된 다른 웹사이트에는 접근할 수 없다. 또한 서버에서도 사용자의 비밀번호를 그대로 저장해서 책임질 일을 만들 필요가 없다. 그래서 오늘은 스프링 시큐리티의 BCryptPasswordEncoder 정의와 사용법을 알아볼 예정이다. BC..