Web/Spring

    [DI 구현하기] 의존성 주입이 필요한 이유와 DI 컨테이너의 탄생

    스프링을 사용하는 핵심이유중 하나는 DI (Dependency Injection) 의존성 주입입니다. 우리는 의존성 주입이 왜 필요한 것인지, 또 스프링이 의존성 주입을 어떻게 해주는지 제대로 이해하고 사용하고 있을까요? 간단한 UserService와 UserDao 예제로 의존성 주입이 왜 필요한 것인지 간단히 이해해보고, 나아가서 스프링이 제공하는 DI 컨테이너를 직접 만들어 보겠습니다. 1단계 : 생성자 주입(?) 현재, 사용할 UserDao 인스턴스를 생성자를 통해 외부에서 전달받는 UserService가 존재합니다. UserService class UserService { private final UserDao userDao; public UserService(UserDao userDao) { t..

    [Tomcat 구현하기] 2. HttpRequest, HttpResponse, RequestMapper, Controller

    이번에는 지난번에 구현한 톰캣을 이용해 요구사항을 구현해보겠습니다. 다음과 같이 기능 요구사항이 주어졌습니다. 기능요구사항 GET /login 요청에 로그인 페이지를 보여준다. GET /register 요청에 회원가입 페이지를 보여준다. POST /register , body를 포함한 요청에 회원가입을 시키고 login 페이지로 redirect 시킨다. POST /login 요청에 로그인 처리를 한다. - 서버에서 세션을 생성해 로그인 정보를 저장한다. - 쿠키에 JSESSION 아이디를 담아서 로그인을 유지시킨다. 로그인 처리가 된 사용자에게는 index.html 페이지를 보여준다. HttpRequest 구현 socket 에 쓰여진 inputStream을 사용하기 편하도록 HttpRequest로 변환해..

    [Tomcat 구현하기] 1. Tomcat, Connector, Socket

    SpringBoot를 사용해 클라이언트-서버 통신을 하게되면 내장된 톰캣을 사용합니다. Tomcat에 대한 이해가 없더라도 우리는 어렵지 않게 외부와 통신을 할 수 있습니다. 그런데 정말 Tomcat을 모르고 웹 어플리케이션 서버를 만들어도 되는 걸까요? 우리는 서버에 요청이 많아져 부하가 생긴다면 Tomcat 설정을 바꿔야할 수도 있습니다. 미리 Tomcat에 대한 이해가 있다면 어느부분에서 문제가 생겼는지, 파악이 가능하고 튜닝까지 가능할 것입니다. 이번 시간에는 Tomcat을 직접 구현해보며 Tomcat을 알아가보겠습니다. 더 나아가 서블릿을 직접 구현하며 웹서버 통신의 흐름을 다뤄봅니다. 다음과 같이 기능 요구사항이 주어졌습니다. 기능요구사항 GET /login 요청에 로그인 페이지를 보여준다...

    [Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터

    Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. Dispatcher Servlet 클라이언트로부터 HTTP 요청이 오면 먼저 Dispatcher Servlet에 도달하게 됩니다. (흐름 편의상 filter는 생략) 스프링 공식문서에서 Dispatcher Servlet은 아래와 같이 설명합니다. Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet, the DispatcherServlet, provides a ..

    [Spring] CORS 관련 405에러 해결방법

    실제 EC2에 서버를 배포하고 프론트의 브라우저에서 요청했을때 CORS 헤더응답을 받지 못하여 405 에러가 발생합니다. 그런데, 프론트의 브라우저에서만 이 에러가 발생합니다. 포스트맨으로 요청했을 때는 모든 메서드가 정상적으로 작동합니다. 이번 포스팅은 배포시에 왜 이런문제가 발생하고 어떻게 해결해야할 지 알아봅니다. OPTIONS 메서드 요청 OPTIONS 메서드 OPTIONS 요청은 브라우저가 서버에게 지원하는 옵션들을 미리 요청하고 허가된 요청에 한해서 전송하기 위한 보안상의 목적이 있다. 네트워크 요청 시 실제 원하는 요청(GET, PUT, POST, DELETE) 전에 OPTIONS 요청을 보내는 경우가 존재합니다. 브라우저는 OPTIONS를 preflight하여 서버에서 허용하는 옵션을 미리..

    [Spring] Bean 등록의 이점

    스프링 Bean의 이점 저번 시간에는 스프링의 탄생 목적에 대해 알아보았습니다. 2022.04.28 - [Web/Spring] - [Spring] 스프링의 탄생목적 - SOLID, DI 컨테이너 저번시간의 내용을 짧게 정리해보겠습니다. 스프링은 좋은 객체지향 프로그래밍을 위해서 탄생했고, 좋은 객체지향 프로그래밍을 위해서는 의존성을 주입해주는 IoC 컨테이너가 필요했습니다. 스프링은 IoC컨테이너를 자동으로 생성해줌으로써 객체지향 프로그래밍을 도와줍니다. 하지만 단지 의존성 주입을 자동으로 해주는 것만으로 스프링을 사용하는 것은 아닌데요. 이번 시간에는 객체를 스프링 Bean으로 등록하면 어떤 이점이 있는지 알아보도록 하겠습니다. 의존성 주입 스프링이 어떻게 의존성 주입을 해줄까요? 스프링은 설정 정보가..

    Spring Bean Validation 적용하기

    기존의 미션들에서 검증기능을 구현하려면 하나하나 다 짜주어야 했습니다. 이제 스프링 부트 프로젝트에서는 @Validated 를 이용해 쉽게 유효성 검증을 수행할 수 있습니다. 이번 시간에는 간단하게 Bean Validation을 내 프로젝트에 적용시켜봅니다. Bean Validation 스프링의 Bean Validation은 클래스 필드에 annotation을 적용하여 해당 필드에게 제약조건을 정의하는 구조입니다. public class LineRequest { @NotBlank(message = "이름을 입력해주세요.") private String name; 앞으로 위의 코드처럼 필드에선 @NotBlank 어노테이션 만으로도 검증이 가능합니다. 적용 방법 순서는 간략하게 아래와 같습니다. 의존성 추가 ..

    [Spring] 스프링의 탄생목적 - SOLID, DI 컨테이너

    이번 포스팅은 앞으로 스프링을 제대로 학습하기에 앞서, 스프링이 어떤 목적을 가지고 탄생했는지 알아보려고 합니다. 스프링을 왜 만들었을까 스프링은 좋은 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임워크 입니다. 개발자들은 객체지향 프로그래밍을 통해 유지보수에 좋은 코드를 작성하려고 노력했습니다. 그래서 좋은 객체지향을 위한 5가지 원칙 (SOLID) 가 탄생했습니다. 객체지향프로그래밍의 5가지 원칙 SRP (Single Responsibility Principle) 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. ‘한 클래스가 하나의 책임만 가져야 한다’ 라는 말만 보면 의미가 모호할 수 있습니다. 그래서 SRP의 중요한 기준은 변경이 있을 때 파급 효과가 적도록 만드는 것입니다. 예..

    [boot+jpa실전 1] 1. 스프링부트 프로젝트 생성

    start.spring.io (스프링 부트 스타터 접속) 원하는 버전과 프로젝트 이름, 라이브러리를 선택한다. 압축해제 후 인텔리제이로 open 한다.

    스프링 기초 정리

    목차 객체지향이란? 좋은 객체지향이란? (객체지향 설계 5가지 원칙) IoC, DI @Component, @ComponentScan 스프링 컨테이너를 통해 Bean을 가져오는 것이 좋은이유 싱글톤 @Configuration @ComponentScan @Component @Autowired 다양한 의존관계 주입 방법 옵션처리 수정자주입말고 생성자 주입을 선택하는 이유 lombok 조회대상 빈이 2개 이상일때 해결방법 3가지 @Autowired 필드 명 매칭 @Qualifier 등록 @Primary annotation 직접 만들기 조회한 빈이 모두 필요할 때 수동 빈 등록은 언제 사용해야 될까? 업무로직 빈 기술지원 빈 다형성을 적극 활용할 때 빈 생명주기 콜백 스프링 빈의 전체적인 라이프 사이클 사용 전에..