이번주는 드디어 스프링을 본격적으로 학습했다.
Servlet, Spring-Core, SpringBoot MVC(request-mapping, handler-method, view-resolver)까지 배웠으니
겉핥기식으로 훑고 지나간 것 사실이나, 그 짧은 시간안에 스프링 프레임워크의 핵심 동작원리를 담으려고 노력하신게 느껴지는 수업이었다.
추가적으로 3/22(토)에 네이버 코테를 봤다. 접근 방식을 잘 잡아야하고, 구현력도 어느정도 필요한 문제들이 나왔는데, 1번부터 오랜시간 막혀서 2번을 손을 대질 못했다. 1번에 대해 만점을 받으려면 최소 O(nlogn)의 시간복잡도로 짜야했는데, 나는 O(n^2)의 풀이밖에 생각이 나질않아 결국 30분 고민하다가 그냥 n^2풀이 구현하고 제출했다.. CS 문제들은 뭐 그럭저럭 손댈만은 했지만, 모르겠는 것들도 많았어서 부족한 부분을 여실히 느낄 수 있었다. 항상 느끼는 내 고질적인 문제점인 구현력에 대한 대비 + 적절한 난이도에 대해 빠른 시간안에 풀이 구상하는 훈련을 계속해서 해나가야겠다.
[수업 내용]
[Web Server와 Web Application Server]

-Web Server는 정적 리소스를 화면에 보여주는 역할, WAS 서버는 동적 리소스에 대한 처리를 담당
-Web 통신은 주로 Client - Web Server - WAS - DB Server 형태로 이루어짐
-Web Server의 예시는 Apache, Nginx이고, WAS의 예시는 Apache Tomcat이 대표적
[Servlet]

서블릿 컨테이너의 담당 역할
- 서블릿 객체 생성 및 관리
- 클라이언트 요청 및 응답 처리
- 서블릿 생명주기(init(), service(), destroy()) 관리
- 멀티 쓰레드 처리
- Filter & Listener 실행
- Session & Cookie 관리
Deployment Descriptor, 배포서술자
- Application에 대한 전체 설정 정보를 가지는 xml 형식의 파일
- webapp/WEB-INF/web.xml에 위치한 파일 내 설정 정보를 기반으로 웹 컨테이너가 Servlet을 구동
<servlet>
<servlet-name>xmlmapping</servlet-name>
<servlet-class>com.section01.xml.LifeCycleTestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>xmlmapping</servlet-name>
<url-pattern>/xml-lifecycle</url-pattern>
</servlet-mapping>
여기서 load-on-startup 속성을 통해 서버 시작 시 서블릿을 자동으로 생성하게 하고, 그에 대한 우선순위를 부여할 수 있음
@WebServlet
/* @WebServlet : 서블릿을 서블릿 컨테이너에 등록
* value 속성 : 서블릿 매핑
* */
@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 1)
public class LifeCycleTest extends HttpServlet {
public LifeCycleTest() {
System.out.println("Annotation 매핑 생성자 호출");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Annotation 매핑 init 메소드 호출");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Annotation 매핑 service 메소드 호출");
}
@Override
public void destroy() {
System.out.println("Annotation 매핑 destroy 메소드 호출");
}
}
- service 메소드는 서블릿에 매핑된 HTTP 요청이 전달됐을 때, 호출되는 메소드
- 내부적으로 HttpServlet에 구현되어 있는 service의 구현을 따라가므로, 405(Method Not Supported) 에러를 반환
- 따라서 필요한 요청에 대한 doGet(), doPost() 등의 메소드를 오버라이딩해서 구현해주어야 함
Servlet LifeCycle

-첫 요청이면 서블릿 객체를 생성하며 init() 메소드를 호출
-이후 작업이 실행 될 때마다 service() 메소드가 요청된 HTTP Method Type에 따라 doGet(), doPost()등을 호출
-최종적으로 Servlet이 서비스 되지 않을 때 destroy() 메소드 호출
Servlet 구동방식(Multi-Thread)

-톰캣과 같은 서블릿 컨테이너는 각 서블릿의 인스턴스를 초기화시 싱글톤 방식으로 생성하고, 이를 재사용
-내부의 쓰레드 풀을 사용하여 멀티쓰레드를 지원하며, 요청에 대한 쓰레드가 할당되면 이후 해당 쓰레드를 통해 Servlet이 호출됨
[Forward & Redirect]

-Foward는 서버 내부적으로 요청에 대한 처리를 위임

-Redirect는 서버가 클라이언트에게 다시 매개변수로 등록한 페이지를 재요청하라고 응답(Status Code 301, 302)
[Cookie & Session]
-HTTP 통신은 Stateless이므로 서버에 클라이언트 요청의 상태를 추적하지 않는다.
-이를 보완하고자 연결이 끊어진 이후에도 클라이언트에 대한 정보를 유지하기 위한 두 가지 방법으로 Cookie와 Session이 사용된다.
Cookie - 클라이언트의 컴퓨터에 데이터를 텍스트 파일 형태로 저장, 보안적으로 취약
Session - 서버에 데이터를 저장하는 기술, 클라이언트에 Session ID를 부여하고 클라이언트가 요청 시 보낸 Session ID와 일치하는 Session의 정보를 컨테이너가 생성하여 해당 객체의 데이터를 사용할 수 있음
- 쿠키는 주로 세션 ID를 저장하여 클라이언트와 서버 간의 세션을 추적하는 데 사용
- 세션은 서버 측에 민감한 사용자 정보를 저장하고, 세션 ID는 쿠키를 통해 클라이언트와 서버 간에 공유
- 세션 ID는 쿠키에 저장되지만, 세션 데이터 자체는 서버에서 관리되므로, 민감한 사용자 데이터는 서버에 저장하여 보안성을 높일 수 있음
- 브라우저 종료 시 세션 쿠키는 자동으로 삭제되고, 서버에서 세션을 invalidate하여 세션을 종료할 수 있음
[Filter & Wrapper]

-요청 및 응답에 따른 서블릿 수행 전후에 지정한 필터를 거쳐 데이터를 가공
-비밀번호 암호화 처리, 인코딩 설정 등 공통 관리에 해당하는 기능을 수행하기 적합
- chain.doFilter(req, resp)를 통한 chaining이 가능
---미완---
[마무리하며]
슬슬 프로젝트를 본격적으로 시작하고 있다. 진짜 곧 있으면 REST API 부분 진도를 마무리하고 본격적인 개발이 시작될 듯한데, 마음을 단단히 먹어야 할 듯하다.
이번에 기획중인 예비 개발자&취준생을 위한 커뮤니티에서 채팅, 모의 면접(LLM API 활용), IT 기사 메일 구독 서비스의 3가지 도전적인 기능이 있는데, 넉넉하진 않은 개발 일정이다보니 솔직히 잘 완성시킬 수 있을지는 의문이다. 목표를 크게 잡고 그걸 이루기 위해 노력하면, 그래도 목표를 처음부터 작게 잡는 것보다는 훨씬 배울 점이 많을 것 같아서 그냥 진행하고자 한다. 최대한 빠르게 문서화부분을 마무리하고, 채팅 부분이나 메일 구독 서비스 부분을 어떻게 구현해봐야할지 빠르게 알아봐야겠다.
매일 코테도 놓지 않고 꾸준히 준비하고, 4월에 정처기 필기도 등록하자 화이팅!
'Beyond SW > 주간 회고' 카테고리의 다른 글
| 한화시스템 Beyond SW캠프 15기 10주차 회고 (1) | 2025.03.31 |
|---|---|
| 한화시스템 Beyond SW캠프 15기 8주차 회고 (0) | 2025.03.17 |
| 한화시스템 Beyond SW캠프 15기 7주차 회고 (7) | 2025.03.09 |
| 한화시스템 Beyond SW캠프 15기 6주차 회고 (1) | 2025.03.03 |
| 한화시스템 Beyond SW캠프 15기 5주차 회고 (0) | 2025.03.02 |