개발 일지/Spring 44

Spring Boot DB 오류(Failed to configure a DataSource)

스프링 프레임워크를 이용해서 프로젝트를 새로 생성하고 실행시켰을 때 아래와 같은 오류가 발생했다. 찾아보니까 Failed to configure a DataSource 에러가 발생하는 이유는 Database에 연결할 때 필요한 정보가 없어서 발생한 것이며, 이러한 문제 말고도 application.properties나 application.yml과 같은 설정 파일을 삭제하거나 위치를 옮겼을 경우에도 볼 수 있는 현상이라고 한다. 나의 경우에는 뭘 건들지도 않았으니 start.spring.io에서 프로젝트 생성할 때 MySQL Driver 의존성 설정으로 인해 발생한 것이 아닐까라고 추측해본다..., 해결방법 1. DataSourceAutoConfiguration 제외 (나는 연습용 프로젝트라 서버가 당장..

[Spring MVC] DTO

DTO(Data Transfer Object)란, 계층간의 데이터 교환을 위해 사용하는 객체이다. 데이터 전송은 클라이언트에서 서버 쪽으로 전송하는 요청 데이터, 서버에서 클라이언트 쪽으로 전송하는 응답 데이터 형식으로 클라이언트와 서버 간에 데이터 전송이 이루어지는데 여기서 DTO를 사용할 수 있다. DTO를 사용하는 이유 코드의 간결성 : DTO 클래스를 통해 클라이언트의 요청 데이터를 하나의 객체로 전달 받을 수 있기 때문에 코드가 간결해진다. 데이터 유효성(Validation) 검증의 단순화 : 유효성 검증 로직을 DTO 클래스로 빼내서 핸들러 메서드의 간결함을 유지할 수 있다. 필요한 데이터만 응답으로 줄 수 있다. : Entity 자체를 클라이언트에 대한 응답으로 넘기면 개인 정보같은 민감한 ..

[Spring MVC] DispatcherServlet

DispatcherServlet은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아서 적합한 컨트롤러에게 위임해주기 때문에 프론트 컨트롤러(Front Controller)라고 할 수 있다. Spring MVC의 요청 처리 흐름을 보면 DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는데, 이러한 패턴을 프론트 컨트롤러 패턴(Front Controller Pattern)이라고 한다. 개발자가 컨트롤러를 구현만 해두면 DispatcherServlet이 알아서 적합한 컨트롤러로 위임해주기 때문에 매우 편리하다. Spring MVC의 요청 처리 흐름 클라이언트가 요청을 전송하면 DispatcherServlet이라는 클래스에 요..

[Spring MVC] Spring MVC

Spring MVC는 클라이언트의 요청을 편리하게 처리해 주는 프레임워크이다. Spring의 모듈 중에는 웹 계층을 담당하는 몇가지 모듈이 있는데, 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈을 spring-webmvc라고 한다. 이 Spring Web MVC를 줄여서 Spring MVC 또는 Spring MVC Framework라고 부른다. 이 모듈을 사용해서 백엔드 프로그래밍의 기본 프레임워크를 잡으면 개발자가 해야 할 영역을 더 적게 만들어줌으로써 기존의 Spring 보다 더 깔끔하고 간편한 개발이 가능하다. Spring MVC에서 M은 Model, V는 View, C는 Controller를 의미한다. Model Spring MVC 기반의 웹 애플리케이션이 클라이언트의..

[Spring] 의존관계 주입 방법

스프링에서 DI 할 수 있는 방법으로는 생성자 주입, 수정자 주입(setter 주입), 필드 주입, 일반 메서드 주입이 있다. 과거에는 수정자, 필드 주입을 많이 사용했지만 최근에는 생성자 주입 사용을 권장하는 추세라고 한다. DI 주입 방법 생성자 주입 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈들을 주입한다. 다음과 같은 특징이 있다. 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다. 불변과 필수 의존 관계에 사용된다. NullPointerException을 방지할 수 있다. 주입받을 필드를 final로 선언 가능하다. 생성자가 1개만 존재하는 경우에는 @Autowired를 생략해도 자동 주입된다. 스프링이 해당 클래스 객체를 생성..

[Spring] Component Scan

스프링은 설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 즉, @Controller, @Component 등 애너테이션을 붙인 클래스들을 스캔하여 빈으로 등록해주는 것이다. 자바 코드에 @Bean이나 XML 등의 설정 정보에 등록할 스프링 빈을 직접 작성해도 되지만, 이렇게 수작업으로 진행하는 경우 설정 정보가 커지거나 누락되는 등 문제가 발생할 수 있기 때문에 컴포넌트 스캔은 매우 유용한 기능이다. 주의할 점 기본적으로 @Component 애너테이션을 빈 등록 대상으로 포함하며, @Controller나 @Service 등은 @Component를 포함하고 있기 때문에 같이 인식한다. 여기서 주의할 점은 @Configuration 또한 @Component 애너테이션이 붙..

[Spring] 빈

빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이며, Spring 컨테이너가 관리하는 자바 객체(POJO)를 의미한다. 스프링은 보통 스프링 컨테이너에 빈 인스턴스를 한 개만 저장하는 싱글톤 방식을 채택하고 있다. 빈은 클래스의 등록정보, getter/setter 메서드를 포함하며, 컨테이너에 사용되는 설정 메타데이터로 생성된다. 설정 메타데이터는 XML 또는 자바 애너테이션, 자바 코드로 표현하고 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의한다. 빈 등록방식 Component Scan - 클래스 위에 @Component를 붙이면 스프링이 알아서 컨테이너에 빈을 등록한다. - 개발자가 직접 컨트롤이 가능한 클래스의 경우에 사용한다. Java 코드 - 클래스를 생성하..

[Spring] 스프링 컨테이너

스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트로, 스프링에서 자바 객체들을 관리하는 공간을 말한다. 개발자를 대신하여 내부에 존재하는 애플리케이션 빈(Bean)의 생명주기를 관리하며, 빈은 스프링에서 자바 객체를 의미한다. 즉, 컨테이너는 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다. 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있으며, 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한다. 이러한 특성으로 인해 다음의 효과를 얻을 수 있다. 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다. 메서드가 언제, 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다. 컨테이너는 크게 BeanFac..

[Spring] Spring Boot

Spring Boot는 엔터프라이즈 애플리케이션을 개발하기 위한 핵심 기능을 제공하는 Spring Project 중 하나이다. 즉, 스프링을 더 쉽게 이용하기 위한 도구라고 볼 수 있다. 스프링을 이용하여 개발할 때, 세팅해야할 요소가 많아서 스프링 기반 애플리케이션 개발을 시작하기도 전에 어려움을 겪는 문제를 Spring Boot를 통해 간단하게 프로젝트를 설정함으로써 해결할 수 있다. 장점 Spring Boot의 최대 장점은 다음과 같은 이유로 비즈니스 로직에만 집중할 수 있다는 것이다. XML 기반의 복잡한 설계 방식 지양 : Spring Boot 이전의 스프링 애플리케이션 개발을 위한 설정은 굉장히 복잡했는데 Spring Boot를 통해서 간단하게 설정할 수 있게 되었다. 의존 라이브러리의 자동 ..

[Spring] PSA

PSA(Portable Service Abstraction)란, 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조이다. 객체지향 프로그래밍에서 어떤 클래스의 본질적인 특성만을 추출해서 일반화하는 것을 추상화(Abstraction)이라고 하며, 추상화된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 일관된 추상화(PSA)의 기본 개념이다. 이는 Spring에서 동작할 수 있는 라이브러리들은 POJO 원칙을 지키게끔 PSA 형태의 추상화가 되어있음을 의미한다. PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반경하기 ..