조회 결과를 Optional로 받는 이유
·
Backend/Spring
JPA를 사용하다 보면 findById() 같은 조회 메서드의 반환 타입이 Optional인 것을 자주 보게 된다.처음 보면“그냥 엔티티를 바로 주면 되는 것 아닌가?”라는 생각이 들 수 있다.하지만 조회라는 작업은 본질적으로 결과가 있을 수도 있고, 없을 수도 있는 작업이다.바로 이 점 때문에 Optional이 필요하다. 조회는 항상 성공하는 것이 아니다데이터베이스 조회는 개발자가 기대한 대로 항상 값을 찾는 것이 아니다.예를 들어 다음과 같은 경우를 생각할 수 있다.사용자가 존재하지 않는 게시글 번호를 요청한 경우이미 삭제된 데이터를 조회한 경우잘못된 파라미터가 전달된 경우아직 저장되지 않은 식별자로 조회한 경우이런 상황에서는 조회 결과가 없을 수밖에 없다.즉, 조회 메서드는 구조적으로 다음 두 가지..
스프링 빈(Bean) 등록 방식 정리
·
Backend/Spring
스프링에서 가장 중요한 개념 중 하나는 빈(Bean)이다.빈은 단순한 자바 객체가 아니라, 스프링 컨테이너가 생성하고 관리하는 객체를 의미한다.즉, 객체는 그냥 new로 만든 것이고,빈은 스프링이 대신 만들어서 관리하는 객체다. 빈은 어떻게 등록하는가스프링에서 빈을 등록하는 방법은 하나가 아니다.대표적으로 다음 3가지 방식이 있다.컴포넌트 스캔 (자동 등록)@Bean을 이용한 수동 등록XML 등록중요한 포인트는 이것이다.모든 빈을 하나의 방식으로 통일하는 것이 아니라,상황에 따라 적절한 방식을 선택해서 사용한다. 컴포넌트 스캔 (자동 등록)가장 많이 사용하는 방식이다.@Servicepublic class TodoService {}@Repositorypublic class TodoRepository ..
서블릿이 생성되고 요청이 처리되는 전체 흐름
·
Backend/Servlet
서블릿은 언제 만들어지고, 요청은 어떻게 처리될까?톰캣을 기준으로 서버 기동 시점 → 요청 처리 시점 → 종료 시점까지서블릿이 어떻게 동작하는지를 전체 흐름으로 정리한다. 서버(톰캣) 기동 시점에 일어나는 일1) 웹 애플리케이션 로딩톰캣 서버를 기동하면, 배포된 웹 애플리케이션을 로딩한다.이 단계는 흔히 “웹앱을 올린다”라고 표현한다.이때 톰캣은 단순히 파일을 읽는 것이 아니라,해당 웹앱을 어떻게 실행할지에 대한 내부 준비 작업을 수행한다.2) 서블릿 매핑 정보 생성 (URL ↔ 서블릿)웹앱이 로딩되면 톰캣은“어떤 URL 요청이 어떤 서블릿으로 가야 하는지”에 대한매핑 테이블을 만든다.이 매핑 정보는 다음 두 가지 방식 중 하나에서 생성된다.① web.xml 방식 (전통 방식)을 읽어서 URL과 서블릿 ..
forward와 JSP 실행 흐름
·
Backend/Servlet
브라우저가 할 수 있는 일은 딱 하나브라우저의 역할은 매우 단순하다.서버에 요청을 보내고, 서버가 보내준 응답(문자들)을 화면에 그리는 것브라우저는 서버 컴퓨터 내부에 있는 파일을 직접 열 수 없다./user/updateForm.jsp 파일을 “읽어서” 여는 능력이 없다서버의 파일 시스템에 접근할 수 없다JSP, Java, DB 같은 것은 전혀 모른다브라우저가 이해할 수 있는 것은 오직 HTML, CSS, JavaScript로 이루어진 문자열뿐이다. JSP는 “파일”이지만 목적은 “프로그램”이다JSP는 파일 형태로 존재하지만, 단순한 정적 HTML 파일이 아니다.JSP 안에는 다음과 같은 것들이 들어간다.${user.name} 같은 EL 표현식 같은 JSTL 태그 같은 자바 코드(있을 수도 있다)이것들..
멀티스레드 환경에서 Servlet 사용
·
Backend/Servlet
Tomcat은 멀티스레드 서버다Tomcat은 멀티스레드 기반 서버다.즉, 여러 사용자가 동시에 요청을 보내면 Tomcat은 다음과 같이 동작한다.요청 하나당 스레드 하나를 할당한다여러 스레드가 동시에 실행된다같은 Servlet 인스턴스를 공유한다이 구조를 정확히 이해하지 못하면Servlet에서 의도하지 않은 버그가 발생한다. Servlet 인스턴스는 몇 개가 생성되는가Servlet은 요청마다 새로 생성되지 않는다.Tomcat이 시작될 때Servlet 클래스당 인스턴스 1개를 생성한다이후 모든 요청은 이 인스턴스를 재사용한다즉 구조는 다음과 같다.Servlet 인스턴스: 1개요청 처리 스레드: 여러 개여러 스레드가 같은 객체를 동시에 사용한다이 점이 멀티스레드 문제의 출발점이다. 요청이 들어왔을 때 내..
Servlet Container와 Servlet의 관계
·
Backend/Servlet
정적인 웹 페이지의 한계HTML만으로 웹 페이지를 만들면 기본적으로 정적인 페이지만 만들 수 있다.정적인 페이지란, 한 번 만들어진 내용이 사용자, 시간, 상태에 따라 바뀌지 않는 페이지를 의미한다.하지만 실제 웹 서비스에서는 다음과 같은 요구가 존재한다.사용자마다 다른 화면을 보여줘야 한다로그인 상태에 따라 다른 결과를 반환해야 한다게시판, 상품 목록처럼 데이터가 계속 바뀌어야 한다이러한 요구는 HTML만으로는 해결할 수 없다.이 한계를 극복하기 위해 등장한 것이 동적인 웹 페이지이고,자바 진영에서 동적인 웹 페이지를 만들기 위한 기술 중 하나가 Servlet이다. Servlet이란 무엇인가Servlet은 자바로 작성된 서버 쪽 프로그램이다.역할은 다음과 같다.클라이언트의 요청을 받아서요청에 포함된 ..
RequestMapping static Map은 괜찮은 이유
·
Backend/Servlet
공유해도 되는 데이터(불변/읽기 위주)냐, 공유하면 안 되는 데이터(요청마다 달라짐)냐이 차이가 안전/위험을 갈라버린다. 실습의 RequestMapping은 이런 성격이다대부분의 간단한 웹서버 실습에서 RequestMapping은 이런 구조다(예시). public class RequestMapping { private static final Map map = new HashMap(); static { map.put("/user/create", new UserCreateController()); map.put("/user/login", new LoginController()); } public static Controller getController(Str..
서블릿에서의 static
·
Backend/Servlet
서블릿은 동시에 여러 요청을 처리하는데, 그때 같은 변수(메모리)를 여러 스레드가 동시에 만지면 값이 섞인다. 그게 사고다.아래는 “서블릿 맥락”에서 감이 오게끔 정리한 설명이다. 서블릿은 요청마다 새로 만들어지지 않는다많이 착각하는게 “요청 1개 오면 서블릿 객체 1개 생성해서 처리하고 버리겠지?”대부분의 서블릿 컨테이너(톰캣)는 서블릿 인스턴스를 보통 1개만 만들어 놓고 재사용한다./hello → HelloServlet 객체 1개요청이 1만 번 와도 그 객체 1개를 계속 쓴다. 2) 동시에 요청이 오면 “스레드”가 여러 개가 된다톰캣은 동시에 여러 클라이언트 요청을 처리해야 하니까 보통 이렇게 한다.요청 A → 스레드 T1이 처리요청 B → 스레드 T2가 처리요청 C → 스레드 T3가 처리문제는 여..