Spring 18

[Spring] @RestControllerAdvice을 사용해 기존의 예외 처리 방식 변경하기

여태까지 공부했던 내용을 응용하기 위해 기존에 진행했던 프로젝트인 큐터디 프로젝트에 대한 고도화 작업을 시작하게 되었다.고도화 작업을 위한 첫 번째 관문은 개별 예외 처리를 전역 예외 처리 방식으로 변경하는 것이었다. 이를 위해 Spring에서 제공하는 @RestControllerAdvice를 사용하게 되었으며, 이번 포스팅은 해당 과정을 정리한 글이다.  기존 예외 처리 방식 PostController@Slf4j@RequiredArgsConstructor@RestControllerpublic class PostController { private final PostsService postsService; private final AuthService authService; @PatchM..

Spring 2024.10.19

[Spring] 동시성 문제를 해결하는 방법

동시성 문제는 백엔드 개발에 있어 매우 중요한 문제 중 하나이다.백엔드 개발자는 동시성을 고려한 프로그래밍을 할 줄 알아야 한다.따라서 이번 장에서는 스프링과 자바를 사용하여간단한 예시를 통해 동시성 문제가 발생하는 경우에 대해 살펴보고이를 해결하는 3가지 방법에 대해 알아보도록 한다.  재고시스템 재고감소 로직 작성재고시스템의 간단한 재고감소 로직을 예시로 동시성 문제를 살펴볼 것이다. 해당 글은 동시성 문제에 대해 집중적으로 다루는 글이므로 코드에 대한 상세한 내용은 생략하고 설명을 진행한다. Stockpackage com.example.stock.domain;import jakarta.persistence.Entity;import jakarta.persistence.GeneratedValue;imp..

Spring 2024.09.19

[Spring JPA] 연관관계 매핑 (4)

연관관계가 필요한 이유 예제 시나리오를 보며 설명을 진행한다. 예제 시나리오회원과 팀이 있다.회원은 하나의 팀에만 소속될 수 있다.회원과 팀은 다대일 관계다. 객체를 테이블에 맞추어 모델링 예제 시나리오에 따라 객체를 테이블에 맞추어 모델링해보면 다음과 같이 나타낼 수 있다.  다음과 같은 모델링 결과를 통해 알 수 있는 점은 객체 간에는 연관관계가 없지만, 테이블 간에는 연관관계가 존재한다는 점이다. 테이블을 자세히 살펴보면, 멤버와 팀이 다대일 관계를 가지고 있고, 이 중, '다'의 관계인 Member가 Foreign Key를 가지고 있는 것을 알 수 있다.   참조 대신에 외래키를 그대로 사용 현재 객체를 테이블에 맞추어 모델링을 진행했으므로 참조 대신에 외래키를 그대로 사용하여 연관관계 매핑을 진..

Spring 2024.05.16

[Spring JPA] 객체와 테이블 매핑 (3)

JPA에서 가장 중요하게 봐야 되는 두 가지는 영속성 컨텍스트와 같이 JPA가 내부적으로 어떤 메커니즘으로 동작하는지에 대한 측면과 객체와 관계형 데이터베이스를 어떻게 매핑하여 쓰는지에 대한 설계적인 측면이 있다. 이번에는 엔티티 매핑에 대해 알아보자.   객체와 테이블 매핑 @Entity@Entity가 붙은 클래스는 JPA가 관리하며, 이를 엔티티라 한다.JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 반드시 붙여야 한다.주의할 점기본 생성자 필수final 클래스, enum, interface, inner 클래스 사용 불가저장할 필드에 final 사용 불가 @Entity 속성속성: nameJPA에서 사용할 이름을 지정한다기본값: 클래스 이름을 그대로 사용같은 클래스 이름이 없으면 가급적 기본..

Spring 2024.05.13

[Spring JPA] 영속성 컨텍스트 (2)

JPA에서 가장 중요한 두 가지 사항이 있는데, 바로 객체와 관계형 데이터베이스를 매핑하는 것과 영속성 컨텍스트를 이해하는 것이다. 이번에는 영속성 컨텍스트에 대해 알아볼 것인데, 영속성 컨텍스트에 대해 명확히 이해한다면 JPA가 어떻게 동작하는지 정확히 이해할 수 있다.  엔티티 매니저 팩토리와 엔티티 매니저 그 전에 JPA를 사용하기 위해서는 먼저 엔티티 매니저 팩토리와 엔티티 매니저에 대해 이해해야 한다.  다음과 같은 웹 어플리케이션을 개발할 때, 엔티티 매니저 팩토리는 고객의 요청이 올 때마다 엔티티 매니저를 생성하게 된다. 엔티티 매니저는 내부적으로 데이터베이스 커넥션을 사용해서 DB를 사용하게 된다.  영속성 컨텍스트 영속성 컨텍스트란, JPA를 이해하는데 가장 중요한 용어로 "엔티티를 영구..

Spring 2024.05.12

[Spring JPA] JPA 소개 (1)

JPA 우리는 애플리케이션 개발 시 주로 객체 지향 언어와 관계형 데이터베이스를 사용하여 개발한다. 과거에 JPA가 등장하기 전에는 개발자들은 SQL에 의존적인 개발을 피할 수 없었다. 하지만 SQL 중심적인 개발을 하게 되면 다음과 같은 문제가 발생한다.무한 반복, 지루한 코드객체 하나를 보관하고 꺼내고 삭제하려면 계속해서 쿼리를 작성해야 한다. 이러한 문제를 해결하기 위해 JPA가 등장하게 되었다. JPA란 Java Persistence API의 약자로, 자바 진영의 ORM 기술 표준을 말한다. ORM (Object Relational Mapping) ORM은 Object Relational Mapping의 약자로 말 그대로 객체와 관계를 매핑하는 것을 말한다. 즉, Relational은 관계형 DB..

Spring 2024.05.12

[스프링부트] 컨트롤러

컨트롤러란, MVC 디자인 패턴에서 C에 해당한다. 컨트롤러는 사용자의 요청을 처리하는데 사용된다. 스프링부트에서 컨트롤러를 사용하는 방법에 대해 간단히 알아보도록 하자. 그 전에, 스프링부트 서버를 띄우고, 브라우저에 http://localhost:8080 URL로 페이지를 요청하면, 다음과 같은 오류가 발생한다. 다음과 같이 Not Found (404)라는 오류가 발생하는데, 404는 HTTP 오류 코드 중 하나로 브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생한다. 이는 요청한 URL(http://localhost:8080)을 스프링부트 서버가 해석할 수 없기 때문이다. 오류를 해결하기 위해서는 컨트롤러를 작성하고 URL에 대한 매핑을 추가해야 한다. 컨트롤러 "HelloController.j..

Spring 2023.11.05

[스프링부트] 스프링부트 프로젝트의 구조

스프링부트 프로젝트의 구조 스프링부트를 사용하여 프로젝트를 만들기 위해서는 프로젝트 구조를 잘 이해해야 한다. 스프링부트 프로젝트의 구조와 파일들에 대해 간단히 알아보자. src/main/java 디렉터리 src/main/java 디렉터리의 하위 패키지는 자바 파일을 작성하는 공간이다. 자바 파일로는 스프링 부트의 컨트롤러, 폼과 DTO, 데이터베이스 처리를 위한 엔티티, 서비스 파일 등이 있다. 프로젝트명 + Application.java 파일 모든 프로그램은 시작을 담당하는 파일이 있는데, 스프링부트 애플리케이션도 마찬가지이다. 스프링부트 애플리케이션에서는 "프로젝트명 + Application.java" 파일이 시작을 담당한다. 만약 스프링부트 프로젝트를 생성할 때 "Hello"라는 이름을 사용하면 ..

Spring 2023.10.19

[스프링부트] 스프링부트란 무엇인가

스프링부트란? 스프링부트(Spring Boot)는 자바의 웹 프레임워크로 기존 스프링 프레임워크(Spring Framework)에 톰캣 서버를 내장하고, 여러 편의 기능들을 추가하여 꾸준한 인기를 누리고 있는 프레임워크이다. 웹 프로그램을 쉽고 빠르게 만들어주는 프레임워크 스프링 부트는 웹 프로그램을 쉽고 빠르게 만들 수 있도록 도와주는 프레임워크이다. 웹 프레임워크 웹 프로그램을 만들기 위해서 웹 프레임워크가 없다면, 웹 프로그램을 위해 만들어야 할 기능이 정말 많다. 하지만, 웹 프레임워크를 사용하면 그런 기능들이 이미 만들어져 있기 때문에 웹 프레임워크에 있는 기능을 익혀서 사용하기만 하면 된다. 웹 프레임워크는 웹 프로그램을 만들기 위한 스타터 키트라고 생각하면 된다. 자바로 만들어진 웹 프레임워..

Spring 2023.09.28

[스프링] 스프링 핵심 원리 기본편 정리: 9. 빈 스코프

빈 스코프 빈 스코프란? 빈 스코프란, 빈이 존재할 수 있는 범위를 뜻한다. 여태까지 우리는 스프링 빈이 컨테이너의 시작과 함께 생성되어서 컨테이너가 종료될 때까지 유지된다고 학습했는데, 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스프링은 싱글톤 스코프 이외에도 다양한 스코프를 지원하는데, 이는 다음과 같다. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고, 더는 관리하지 않는 매우 짧은 범위의 스코프 웹 관련 스코프 request: 웹 요청이 들어오고, 나갈 때까지 유지되는 스코프 session: 웹 세션이 생성되고, 종료될 때까지 유지되는 스코프 appli..

Spring 2023.09.13