Web

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

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

    [Servlet 구현하기] Controller Scanner와 JSON View

    지난 시간에 어노테이션 기반의 MVC 프레임워크를 만들어 보았습니다. 아직은 개선할 점이 있었습니다. 컨트롤러 어노테이션 스캔 역할 분리 JSON view 지원 프레임워크에서 기본으로 어노테이션 핸들러 지원하기 위의 개선점들을 해결하기 전에, 생각해봐야할 점이 있었습니다. MVC 프레임워크 패키지가 아닌 APP (어플리케이션) 패키지에서 지원하는 핸들러와 어댑터를 추가해주고 있었습니다. 저희가 스프링 MVC를 사용할때 어노테이션 매핑을 따로 추가해주지 않아도 기본으로 지원하는 것 처럼, 개발자는 어노테이션 매핑에 대한 추가설정 없이 기본적으로 제공받도록 구현하고 싶었습니다. 그래서 MVC 프레임워크 패키지에 DefaultApplicationInitializer를 만들어주었습니다. package nexts..

    [Servlet 구현하기] 어노테이션 기반 MVC 프레임워크 구현

    톰캣 코드 저장소 : https://github.com/dongho108/jwp-dashboard-http/tree/step234 어노테이션기반 MVC 프레임워크 코드 저장소 : https://github.com/dongho108/jwp-dashboard-mvc/tree/step1 지난 시간에는 서블릿 컨테이너인 톰캣을 구현해보았습니다. 구현했던 톰캣 기능 요청당 쓰레드 생성 (쓰레드관리) 커넥션관리 서버소켓 생성 HttpRequest, HttpResponse 변환 컨트롤러 찾기 컨트롤러 실행 그래서 4~6번은 아래와 같은 구조가 만들어졌습니다. 위와 같은 구조에는 문제점이 있었습니다. Request에 맞는 Controller를 찾아주는 메서드와 클래스가 전혀 다른 곳에 있는 패키지를 의존하고 있습니다...

    [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하여 서버에서 허용하는 옵션을 미리..

    [Kotlin] 내부 프로퍼티의 Setter만 막는 2가지 방법

    외부에서 변경(setter)을 막기 위한 변수가 필요할 때가 있습니다. 그리고 코틀린에서는 생성자에서 val로 변수를 선언하면 자동으로 getter만 지원합니다. 하지만 생성자에 노출되지 않고 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하고 싶다면 어떻게 해야할까요? 이번 포스팅은 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하기 위한 2가지 방법을 소개하고 이 둘의 차이점을 설명합니다. private set data class Game(val words: Words, val date: LocalDate) { var count: Int = 0 private set ... count는 생성자로 직접 주입해주지 않고 내부에서만 사용되는 변수이지만, gett..

    [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 어노테이션 만으로도 검증이 가능합니다. 적용 방법 순서는 간략하게 아래와 같습니다. 의존성 추가 ..