스프링 MVC 2편 - 섹션 7~9
·
Spring
서블릿 필터필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.필터 흐름디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고, 디스패처 서블릿 전/후에 처리하는 것이다. 흐름을 간단하게 정리하면 아래와 같다.HTTP 요청 → WAS → 필터1 → …. → 필터5 → 서블릿 → 컨트롤러 필터는 체인으로 구성되는데, 중간에 자유롭게 추가할 수 있다.필터 인터페이스와 메서드public inte..
스프링 MVC 2편 - 섹션 4~5
·
Spring
Bean ValidationBean Validation은 JSR 기술 표준으로, 검증 애노테이션과 여러 인터페이스의 모음이다.Validator (검증기)스프링이 제공하는 검증용 객체이다. 개발자는 해당 인터페이스를 구현하여 클래스로 사용하면 되기 때문에 검증 로직과 비즈니스 로직을 구분할 수 있게 되고 체계적으로 검증 기능을 도입할 수 있게 된다.public interface Validator { boolean supports(Class clazz); void validate(Object target, Errors errors);}해당 인터페이스를 구현한 구현체 즉, 검증기를 WebDataBinder에 추가하면 컨트롤러에서 검증기를 자동으로 적용할 수 있게 된다. WebDataBinder는 Sprin..
스프링 MVC 1편 - 섹션 4~7
·
Spring
MVC 프레임워크Spring MVC 구조Dispatcher Servlet은 Front Controller와 비슷한 역할을 한다. Dispatcher Servlet은 우선적으로 클라이언트로부터 모든 요청을 받게 되며, 각각의 요청에 따른 처리는 개별 컨트롤러 클래스로 위임 한다. 이러한 개별 컨트롤러 클래스를 핸들러(Handler)라고도 한다. 쉽게 말해서 디스패처 서블릿은 Spring의 가장 앞단에서 요청을 처리할 컨트롤러를 찾아서 위임하고, 그 결과를 받아오는 역할을 한다.동작 과정Dispatcher Servlet이 실제 요청 처리를 핸들러에게 위임하기 위해서는 해당 요청을 어떤 컨트롤러에 보내야할 지 판단해야 한다. 이를 판단하기 위해, 다음과 같은 과정을 거친다.1. 핸들러 조회 Dispatcher..
스프링 MVC 1편 - 섹션 1~3
·
Spring
WAS와 Web ServerWeb ServerWeb Server는 웹 브라우저(클라이언트)로부터 HTTP 요청을 받아 HTML 문서와 같은 정적 컨텐츠를 제공하는 프로그램을 말한다.정적 컨텐츠란, 요청 인자 값에 상관없이 달라지지 않는 컨텐츠(html, css, image 등) 즉, 어느 사용자의 요청이든 항상 동일한 컨텐츠를 일컫는다. 대표적인 Web Server로는 Apache와 Nginx가 있다. 하지만 클라이언트로부터 동적 컨텐츠를 보여주어야 한다면 어떨까? 이때, 필요한 것이 바로 WAS다.WASWAS는 Web Application Server의 약자로 DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 프로그램이다. 동적 컨텐츠란, 정적 컨텐츠와 반대로 요청 인자에..
스프링 핵심 원리 기본편 - 섹션 9~10
·
Spring
빈 생명주기 콜백스프링 빈은 다음과 같은 라이프 사이클을 가진다.스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 스프링 빈은 객체를 생성하고, 의존관계 주입이 모두 끝난 후에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 때문에 초기화 작업은 의존관계 주입이 모두 완료된 후에 호출되어야 한다. 이를 위해 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 기능을 제공한다. 또한 소멸 콜백도 제공한다. 싱글톤 빈들의 경우, 스프링 컨테이너가 종료될 때, 싱글톤 빈들도 함께 종료되기 때문에 스프링 컨테이너가 종료되기 직전에 소멸 전 콜백이 일어난다.객체의 생성과 초기화를 분리하자! 생성자 안에..
스프링 핵심 원리 기본편 - 섹션 7~8
·
Spring
컴포넌트 스캔지금까지 살펴본 방법은 @Bean 을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 이는 개발자 입장에서 매우 귀찮은 작업이다. 때문에 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.컴포넌트 스캔컴포넌트 스캔을 사용하려면 @ComponentScan 애노테이션을 설정 정보에 붙여주면 된다.@Configuration@ComponentScanpublic class AutoAppConfig {}기존 설정 정보와 다르게 @Bean 을 통해 직접 등록한 스프링 빈이 하나도 없어도, 컴포넌트 스캔을 통해 @Component 애노테이션이 붙은 클래스를 스캔해서 자동으로 스프링 빈으로 등록한다. 이때, basePackages라는 속성을 통해 탐색할 패..
스프링 핵심 원리 기본편 - 섹션 4~6
·
Spring
제어의 역전과 의존관계 주입IoC (Inversion of Control)스프링과 같은 프레임워크를 사용할 때를 생각해보자. Controller, Service 같은 객체들의 동작을 우리가 직접 구현하기는 하지만, 해당 객체들이 어느 시점에 호출될 지는 신경쓰지 않는다. 단지 프레임워크가 요구하는대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다. 즉, 어플리케이션 코드에 작성한 객체들을 프레임워크가 필요한 시점에 가져다가 프로그램을 구동하기 때문에 프로그램의 제어권이 프레임워크로 역전된다. 이처럼, 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라 한다.DI (Depende..
[아티클] SSH config를 통해 간편하게 SSH 연결하기
·
대외 활동/SOPT
저희는 지금까지 EC2에 접속하기 위해서 터미널에 아래와 같이 명령어를 입력해야만 했습니다.ssh -i "pem 키 위치" ubuntu@'퍼블릭 DNS 주소'너무 귀찮치 않으신가요?? 오늘은 이를 간편하게 접속할 수 있는 방법에 대해 알아보고자 합니다.1. .ssh 폴더 생성mkdir ~/.ssh (이미 존재한다면 이 단계는 넘어가셔도 됩니다!)2. 키페어 파일 가져오기EC2에 접속하기 위해 필요한 pem키!! 다들 기억하시죠? 현재 저장되어 있는 pem키의 위치를 홈 디렉터리 내의 .ssh 폴더로 이동시켜 줄게요.mv 'pem키이름.pem' ~/.ssh/그 후, 해당 pem키에 대해 권한을 설정해줘야겠죠? 아래 명령어를 입력합시다.chmod 400 "pem키 이름"3. Config 파일 설정하기그럼 이..
[아티클] JPA N+1 문제
·
대외 활동/SOPT
지연 로딩? 즉시 로딩?다들 3차 세미나 기억나시나요?@Entity@Getter@NoArgsConstructorpublic class Post extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String content; @ManyToOne(fetch = FetchType.LAZY) private Blog blog;}위의 코드는 3차 세미나에서 진행했던 코드 중 일부분입니다!저는 개인적으로 3차 세미나 내용을 복습하면서 fetch = FetchType.LAZY 가 무엇인지, 왜 지연 로딩 방식..
[Programmers] 표 편집 (Java) - 2021 카카오 채용연계형 인턴십
·
알고리즘
문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/81303 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 문제 분석시간 복잡도를 줄이는 것이 관건인 문제이다. 문제에서 주어진 변수들의 범위는 5 ≤ n ≤ 1,000,000과 1 ≤ cmd의 원소 개수 ≤ 200,000이다. 명령어 'U' 또는 'D'가 입력되었을 때, 주어진 숫자 X만큼 이동하는 것이 핵심이다. 이때, 삭제된 행으로 이동하는 것은 이동했다고 간주하지 않기 때문에, 배열로 선언하여 순차 탐색으로 포인터를 움직인다면 주어진 X보다 더 많이 반복문을 돌며 포인터를 이동해야하기 ..