스프링부트는 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 bean validator를 인지하고 스프링에 통합 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 , 표준화한 것이 Bean Validation @Validated : 스프링 전용 검증 어노테이션 @Valid: 자바 표준 검증 어노테이션 검증 순서 1. @ModelAttribute 각각의 필드에 타입 변환 시도 1) 성공하면 다음으로 2) 실패하면 typeMismatch 로 FieldError 추가 2. Validator 적용(실제 min , max 등의 검증 기능) 바인딩에 성공한 필드만 Bean Validation을 적용 BeanValidator 는 바인딩에 실패한 필드는 BeanValidati..
Spring
어떤 프로젝트에 참여해서 소스 코드를 보다 보면, 어떤 메소드에는 @Transactional이, 또 어떤 메소드에는 @Transactional(readOnly=true) 어노테이션이 붙어있는 것을 종종 목격할 수 있다. 이번 글에서는 이 둘의 차이점과 @Transactional(readOnly=true)를 사용하는 이유에 대해서 알아보려고 한다. 우선 @Transactional(readOnly=true)에 대해 언급하기 이전에트랜잭션과 @Transactional이 무엇인지부터 간단하게 알아보자. ⚽ 트랜잭션과 @Transactional 어노테이션트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위이다. 예시를 들자면 춘식이와 루피가 돈을 주고 받는 상황이 있다고 가정..
이 글은 김영한님 스프링 입문 강의를 수강하고 요약한 글임을 미리 알려드립니다. 웹 개발에서 클라이언트와 서버가 데이터를 주고 받는 방법에는 서버가 주고받는 방법에는 다음 3가지 방법이 있습니다. 1. 정적 컨텐츠 2. MVC와 템플릿 엔진 3. API 먼저 정적 컨텐츠에 대해서 알아보겠습니다. 🧐 정적 컨텐츠 정적 컨텐츠 방식은 서버에서 어떤 html 파일에 대해 작업을 하지 않고 그대로 웹 브라우저에 전달해주는 것을 말합니다. 클라이언트가 서버에서 요청하면 내장 톰캣 서버는 요청을 스프링에 전달하고 스프링은 컨트롤러에서 요청 url이 매핑된 메서드를 찾아서 해당 메서드를 실행하고, 만약 없다면 resources/static에서 요청한 url에서의 이름에 해당하는 html 파일을 찾아 그대로 클라이언트..
🧐 JPA란? JPA(Java Persistence API)는 자바 ORM 기술에 대한 API 표준입니다. 이렇게 설명하면 잘 와닿지 않을 것입니다. JPA에 대해 알아보기 전에 먼저 ORM이 무엇인지부터 알아야하기 때문에 ORM에 대해 먼저 짚고 넘어가도록 하겠습니다. 📘 ORM ORM이란 Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말합니다. 이게 무슨 말인지 차근차근 알아보겠습니다. ORM이 등장하기 이전에는 원래 관계형 데이터베이스의 데이터를 사용하기 위해서는 SQL을 개발자가 직접 작성을 해야했습니다. 하지만, 비즈니스 로직을 구현해야하는 개발자 입장에서 SQL 까지 신경쓰는 것은 매우 번거로운 일입니다. 이러한 번거로움을 해소하기 위해 등..
이번 글에서는 Spring에서 선언적 트랜잭션 처리를 지원하는 @Transactional 어노테이션에 대해 알아보도록 하겠습니다. 알아보기 이전에, 우선 트랜잭션이 무엇인지에 대해 먼저 알아보겠습니다. 🧐 트랜잭션(Transaction)이란? 트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다. 데이터베이스의 상태를 변화시킨다는 것은 무엇을 의미하는 것일까요? 🤔 간단하게 말해서 아래의 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미합니다. SELECT INSERT DELETE UPDATE 착각하지 말아야 할 것은, 작업의 단위는 질의어 한문장이 아니..
애플리케이션을 개발할 때, 데이터의 유효성을 검사하는 것은 일반적으로 애플리케이션 전체에서 발생합니다. 클라이언트에서 요청한 데이터가 유효한지, 서비스 Layer에서 파라미터 값이 제대로 된 값인지 등 여러 곳에서 데이터 검증은 필수입니다. 하지만 유효성 검증에는 이런 특징이 있는 만큼 다음과 같은 문제점들이 존재합니다. 애플리케이션 전체에 분산되어 있다. 코드 중복이 심하다. 비즈니스 로직에 섞여있어 복잡하고, 이러한 문제점들 때문에 유효성 검증은 유지/보수가 어렵다. 이러한 문제를 해결하기 위해 Java에서는 2009년부터 Bean Validation이라는 데이터 유효성 검사 프레임워크를 제공하고 있습니다. Bean Validation은 위에서 말한 문제들을 해결하기 위해 다양한 제약(Contrain..
Spring과 Lombok을 사용한다면 꼭 알고 있어야하는 생성자 관련 어노테이션들인 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor에 대해서 알아보도록 하겠습니다. 이 세가지 어노테이션은 뒤에 붙은 Constructor라는 단어로부터, 개발자 대신 생성자를 대신 생성해주는 역할을 한다는 것을 유추할 수 있습니다. 1. @NoArgsConstructor @NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 만들어줍니다. 아래 코드로 한 번 설명해보겠습니다. @RequiredArgsConstructor public class Member { private String email; private String name..
🧐 @Autowired란? @Autowired란 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션입니다. 여기서 의존성 주입이란 필요한 객체를 직접 생성하는 것이 아닌 런타임시에 외부로부터 객체를 받아 사용하는 것입니다. 따라서 클래스 레벨에서는 의존관계가 고정되지 않고 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다는 장점이 있습니다. 어노테이션과 빈이란? 💡 어노테이션 필드, 메서드, 클래스에 컴파일 타임과 런타임에 적용될 메타데이터를 말합니다. 💡 빈 스프링에서는 스프링이 제어권을 가져서 직접 생성하고 의존관계를 부여하는 자바 객체를 스프링 빈이라고 부릅니다. 스프링 컨테이너에 빈들을 모두 등록한 후에, 의존성 주입 단계가 이루어집니다 이..
HTTP 요청과 응답에서 자주 사용되는 @RequestBody, @ResponseBody 어노테이션에 대해 알아보겠습니다. 스프링 프레임워크에서 비동기 처리를 하는 경우, @RequestBody, @ResponseBody를 사용하게 되는데, 본 내용을 학습하기 이전에 동기/비동기 통신에 대한 개념을 알아두면 좋기에 잘 모르고 계신다면 아래 링크 페이지를 보고 오시는 것을 권장합니다. 웹의 비동기/동기 통신 웹의 비동기/동기 통신 웹 개발을 하다보면 비동기(Async)와 동기(Sync)라는 용어를 자주 접하게 될 것입니다. 이 두 용어는 웹에서 데이터를 주고받는 방식을 설명하는데 사용되는데, 동기(Sync)는 jaesungyoun.tistory.com 클라이언트에서 서버로 통신하는 메시지를 요청(Reque..
웹에서 클라이언트로부터 HTTP 요청을 받아 처리 후 처리 결과를 사용자에게 넘겨줄 때, 컨트롤러 단에서 종종 ResponseEntity라는 클래스를 사용하는 것을 볼 수 있습니다. 오늘은 이 ReponseEntity에 대해서 알아보겠습니다. 1. ResponseEntity란? Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재합니다. 이 클래스는 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스입니다. public class HttpEntity { private final HttpHeaders headers; @Nullable private final T body; } public clas..
오늘은 Spring Security의 인증 절차 인터페이스인 UserDetailsService에 대해서 알아보고 구현해보도록 하겠습니다. UserDetailsService 인터페이스는 DB에서 유저 정보를 가져오는 역할을 담당합니다. 해당 인터페이스의 메소드에서 DB의 유저 정보를 가져와서 AuthenticationProvider 인터페이스로 유저 정보를 리턴하면, 그 곳에서 사용자가 입력한 로그인 정보와 비교합니다. 🧐 1. UserDetails UserDetails 인터페이스는 Spring Security가 사용자 정보를 알 수 있도록 사용자의 정보를 담는 인터페이스입니다. 이 인터페이스를 구현하면 Spring Security에서 구현 클래스를 사용자 정보로 인식하고 인증 작업을 하게 됩니다. Use..
싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야 한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 가능해야 한다. 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. 상태를 유지하게 설계(특정 클라이언트가 필드 값을 변경할 수 있는 경우 등) 해버리면 사용자 A가 필드를 수..