공부/springboot 22

스프링 - webSocket 을 이용해서 채팅 구현하기

webSocket : 2011년에 나온 비교적 최신 기술이며, http 처럼 일종의 통신 규약이다. 한번 연결된 이후에 계속해서 연결 상태가 유지되는 통신이라고 생각하면 된다. 흐름: 1. 스프링 내부에서 webSocket 요청을 받을 endPoint 설정 2. 자바 스크립트 - 스프링간의 webSocket 통신 연결 3. 요청(메시지)이 들어올시 처리될 코드 작성 실제 코드: 0. websocket 을 사용하기 위한 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-websocket' 1. WebSocketConfig 클래스 @Configuration @EnableWebSocket @RequiredArgsConstructor p..

공부/springboot 2024.03.08

SpringMVC(3) : 서블릿 요청에 대한 응답

이 게시글에서는 사용자의 요청을 듣고, 서버가 응답해주는 방법을 정리한다. 사용자의 응답 역시 HTTP 메시지 형식인데, 이를 손쉽게 만드는 방법에 대한 내용이다. HTTP 메시지 header 만들기 @WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header") public class ResponseHeaderServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //[status-line] respo..

공부/springboot 2023.12.11

SpringMVC(2) : 서블릿 요청 처리

서블릿은 HTTP 통신을 더 쉽게 사용하기 위해 만들어진 자바 기능이다. 따라서 이를 이용한 HttpServletRequest 와 HttpServletResponse 역시 정보를 더 쉽게 추출해내거나 삽입하는 기능을 가지고 있다. 이 게시글에서는 HttpServletRequest 를 이용해 HTTP 요청 메시지의 내용을 꺼내는 다양한 방법과 HttpServletResponse를 이용해 다양한 방식으로 응답을 보내고 쿠키 등의 부가 설정을 하는 방법을 살펴볼 것이다. HTTP 메시지의 구조 HTTP통신을 다루는 기술인만큼 HTTP 통신의 기본 규약을 알아야할 필요가 있다. 이 게시글에서는 오직 http 메시지의 구조만 잠깐 흩고 지나갈것이다. http 통신에 대한 더 깊은 이해를 바라면 이전 게시글을 참조..

공부/springboot 2023.12.08

SpringMVC(1) : 웹 어플리케이션 서버(WAS) 의 이해

웹 서버(Web Server)와 웹 어플리케이션 서버(Web Application Server) 이 둘의 경계는 모호하나 굳이 구분하면 정적인 웹 서버와 동적인 웹 어플리케이션 서버로 나눌수 있다. 정적인 서버는 오직 정적 리소스만 제공하며, 따라서 html, css, js 파일, 이미지 등을 클라이언트에게 전송해주나, DB에 저장된 데이터 등을 이용해 그에 맞는 화면을 클라이언트에게 전송해주는 것은 불가능하다. 반대로 was는 프로그램 코드를 실행하여, 애플리케이션 로직을 수행 그에 맞는 화면을 보여주거나 행동을 하는 것이 가능하다. 웹 어플리케이션 서버가 웹 서버의 개념까지 포함하여 더 많은 기능을 제공한다고 생각하면 편하다. 일반적으로 웹 시스템은 웹 서버 => 웹 어플리케이션 서버 => DB 로 ..

공부/springboot 2023.12.06

스프링 레거시와 스프링 부트의 차이

스프링은 크게 스프링 레거시와 스프링 부트로 나뉜다. 스프링 레거시는 일반적인 Spring Framework 프로젝트를 말하며, 스프링 부트는 기존의 레거시에서 사용자가 직접 해줘야만 했던 많은 사전 작업들을 미리 설정해두거나, 쉽게 설정할수 있는 프로젝트다. 필자는 본래 스프링 부트로 Spring Framework를 학습했으나 이번 기회에 레거시를 사용해볼 기회가 생겨 그 차이를 정리한다. 일단 대표적인 차이는 다음과 같다. 레거시 부트 자유도 자유롭게 라이브러리 설정 가능. 대신 손이 많이 감 프로젝트 구성 단계에서 범용적인 라이브러리 선택 가능. 외부 라이브러리를 추가할시 사용자가 gradle이나 maven, 또는 직접 추가해줘야하는 작업 필요. 서버 따로 tomcat 같은 웹 어플리케이션 서버를 ..

공부/springboot 2023.10.19

(6)빈 자동 등록과 자동 주입

@ComponentScan 과 @Autowired 개발자의 편의를 위해 @Configuration 클래스 내에서 @Bean을 통해 수동으로 등록하지 않고 자동으로 등록하는 방법이 존재한다. @ComponentScan 어노테이션을 사용하면, @Component 어노테이션이 붙은 클래스가 자동으로 빈으로 등록된다. 빈 이름은 첫글자가 소문자인 클래스 이름 그대로 설정된다. #AutoAppConfig @Configuration @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { } // 기존에 만든 Config 클래스를 제외하기 ..

공부/springboot 2023.05.15

(5) 스프링 컨테이너 - 싱글톤

스프링은 태생적으로 웹 어플리케이션에 특화되어 있는데, 웹 어플리케이션은 보통 같은 요청이 동시다발적으로 들어오곤 한다. 만약 100명의 고객이 동일한 요청을 한다고 가정해보자. 그러면 동일한 역할을 하는 객체를 100개를 생성하게 될 것이다. 그런데 그 요청이 모든 고객에게 공통적인 사항이라면 (ex - 공지사항 출력, 판매 상품 출력 등) 100개의 객체를 생성하는 것보다 1개의 객체를 100명이 공유하는게 메모리 측면에서 더 효율적일 것이다. 즉, 싱글톤을 사용해야 한다. 순수 싱글톤 만들기 자바 코드를 사용하지 않고 싱글톤 패턴을 만들수 있다. 핵심은 아래와 같다. 1. static키워드를 사용해서 미리 자신의 인스턴스를 만들어두고, final키워드를 더해 재할당이 안되도록 만든다. 2. 매개변수..

공부/springboot 2023.05.14

(3) 스프링 컨테이너와 빈 조회

스프링 컨테이너 스프링 컨테이너의 종류 BeanFactory 스프링 컨테이너 최상의 인터페이스다. 스프링 빈을 관리, 조회하는 역할을 담당한다. getBean()을 비롯하여 다수의 기능을 제공한다. ApplicationContext BeanFactory를 상속받는 인터페이스다. 국제화기능, 환경변수, 어플리케이션 이벤트 등 다양한 추가 기능을 제공한다. BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다. BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다 AnnotationConfigApplicationContext : ApplicationContext의 구현체다. 생성자 함수에 @Configuration 클..

공부/springboot 2023.05.10

(2) 스프링을 활용한 DI

앞서 보았던 순수 자바코드만을 활용한 DI는 한눈에 의존관계를 파악하기 힘들었다. 스프링은 이러한 문제를 해결하기 위해 Bean 컨테이너를 제공한다. Bean이란 스프링에서 관리해주는 객체를 의미한다. 만약 어떤 객체가 빈으로 등록되어 있다면, 그 객체를 주입 받을때 스프링 컨테이너에서 자동으로 해주기때문에 편리하다. 먼저 주입 객체들을빈으로 등록하자. # Config @Configuration public class Config { @Bean public Alphabet alphabet(){ return new B(); } } @Configuration : 스프링 설정 클래스라는 것을 의미한다. 빈을 수동으로 등록해줄수 있다. @Bean : 메서드의 반환 객체를 빈으로 등록한다. 빈 이름은 메서드 이름..

공부/springboot 2023.05.10

(1) 스프링 사용하지 않고 OCP, DIP 지키기

아래의 코드는 Alphabet 이라는 인터페이스와 그를 상속받는 A, B의 클래스다. 여기서 className 이라는 메서드는 각각 자신의 클래스 이름 A, B를 출력하게 된다. # 인터페이스 public interface Alphabet { void className(); } # 구현체 A public class A implements Alphabet{ @Override public void className() { System.out.println("A"); } } # 구현체 B public class B implements Alphabet{ @Override public void className() { System.out.println("B"); } } 이때 인터페이스 Alphabet을 참조하면서..

공부/springboot 2023.05.10