개발 일지 168

[Spring MVC] @Valid / @Validated

Spring MVC를 학습하는 도중에 @Valid와 별개로 @Validated를 추가하는 이유가 궁금해서 찾아보았다. 결론부터 얘기하자면 @Valid와 @Validated를 같이 사용하는 이유는 위 코드의 CoffeeController 클래스의 모든 메서드에 대해서 Spring의 제약 조건을 사용하여 데이터 유효성 검사를 수행하기 위해서이다. @Valid와 @Validated 애너테이션은 모두 메서드 파라미터에 적용되며, 메서드의 파라미터로 들어오는 입력 값의 유효성 검사를 수행하는 Spring Framework 애너테이션이다. @Valid 애너테이션은 Java Bean Validation API를 사용해서 데이터 유효성 검사를 수행하는데, 만약 입력 값이 제약 조건과 일치하지 않으면 'MethodArg..

[Spring MVC] @Rest + @Controller/@ControllerAdvice

@Controller / @RestController Spring에서 컨트롤러를 지정해 주기 위한 애너테이션은 @Controller와 @RestController가 있다. @Controller는 클래스를 SpringMVC 컨트롤러로 표시하는 데 사용되며, 주로 사용자의 요청을 처리하고 난 후 정해진 뷰에 객체를 넘겨주는 역할을 한다. @Controller는 전통적인 Spring MVC 컨트롤러이며, @RestController는 RESTful 웹 서비스 컨트롤러이다. Spring은 @Controller에 @ResponseBody를 추가해서 @RestController를 도입했으며, 이 둘은 HTTP Response Body가 생성되는 방식에 차이가 있다. @Controller는 Model 객체를 만들어 ..

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이라는 클래스에 요..

정규 표현식(정규식)

정규 표현식(regular expression, regexp)은 프로그래밍에서 문자열을 다룰 때, 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 주로 프로그래밍 언어에서 문자열의 검색과 치환을 위한 용도로 사용된다. 일반적인 조건문으로는 복잡한 코드도 정규 표현식을 이용하면 간단하게 표현할 수 있지만 정규 표현식을 숙지하고 있지 않다면 이해하기 힘들다. 다음은 정규 표현식의 용어들이다. ^ : 문자열의 시작을 의미한다. $ : 문자열의 끝을 의미한다. * : * 앞에 평가할 대상이 0개 이상인지를 평가한다. \s : 공백 문자열을 의미한다. \S : 공백 문자열이 아닌 나머지 문자열을 의미한다. ? : ? 앞에 평가할 대상이 0개 또는 1개인지를 의미한다. + : + 앞에 평가..

개발 일지/etc 2023.02.14

[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 코드 - 클래스를 생성하..