Spring MVC와 Servlet
Computer Science/Spring Boot
서버에서 수행해야 하는 일서버는 사용자의 HTTP 요청을 받고 해당 요청에 따른 응답을 내려준다. 하지만 우리가 코드를 작성할 땐 HTTP 요청을 받기 위한 TCP소켓을 열고, HTTP 메세지를 파싱하고 응답 메세지를 작성하고 하는 번거로운 일을 하지 않고 "어떤 요청에서는 어떤 로직이 수행된다"라는 코드만 작성한다.어떻게 이렇게 간단하게 할 수 있을까?그 이유는 해당 작업들을 WAS가 수행해주기 때문이다. 흔히 사용하는 Tomcat에서는 서블릿 컨테이너를 통해 서블릿 스펙을 지원한다. Tomcat이 아니더라도 다른 이전 포스팅에서 말했던 다른 서블릿 컨테이너들은 모두 서블릿 스펙을 지원한다. 그럼 서블릿 스펙을 지원하지 않는 다른 WAS들은 HTTP 파싱부터 다 해야하나요? 라는 생각이 들 수도 있지만..
스프링 컨테이너와 빈(Bean) - Lifecycle Callback과 Scope
Computer Science/Spring Boot
지난 번에 Spring Bean이 어떻게 생성되는지 알아보았다. 이번엔 이 빈들이 어떻게 관리되는지 알아보자.Bean의 Lifecycle Callback데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 피료한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화과 종료 작업이 필요하다. 스프링에서는 이런 초기화 작업과 종료 작업을 어떻게 진행하는지 확인해보자. 예제로 외부 네트워크에 연결하는 객체인 NetworkClient를 생성한다고 가정하고 진행해보자. NetworkClient는 애플리케이션 시작 시점에 connect() 메서드를 호출해서 연결하고 애플리케이션이 종료되면 disconnect()를 호출해야한다고 가정해보자.public cl..
스프링 컨테이너와 빈(Bean) - 싱글톤과 의존관계 주입 방법
Computer Science/Spring Boot
싱글톤(Singleton) 컨테이너스프링의 컨테이너는 싱글톤 컨테이너라고도 부른다. 그 이유는 단순하게 컨테이너에서 객체들을 싱글톤으로 관리해주기 때문이다. 그럼 여기서 싱글톤이란 무엇인지 알아보자. 싱글톤(Singleton)싱글톤이란 하나의 클래스에서 단 하나의 객체 인스턴스만 생성하도록 보장하는 디자인 패턴이다.왜 이런 방식을 사용할까? 싱글톤이 아니라면 다음과 같은 상황이 일어날 수 있다.만약 여러 클라이언트가 memberService가 필요한 요청을 보냈다고 생각해보자. 그러면 스프링은 매 요청마다 memberService를 생성하고 응답을 보낼 것이다. 이런 방식은 사용자가 늘어나면 늘어날 수록 메모리 낭비가 심하다. 이것을 해결하기 위해 등장한 패턴이 바로 싱글톤 패턴이다. 그럼 어떻게 싱글톤..
스프링 컨테이너와 빈(Bean) - ApplicationContext 동작 과정
Computer Science/Spring Boot
스프링 컨테이너: 왜 컨테이너가 필요할까?IoC / DI의 본질을 알아보자먼저 IoC란 Inversion of Control의 약자로 그대로 풀이하면 "제어의 역전"이다. 객체 생성, 생명주기, 의존성 연결 등 제어 흐름을 애플리케이션 코드가 아닌 외부(프레임워크)가 주도하는 것이다.단순하게 IoC에 대한 정의는 쉽게 찾아볼 수 있다. 근데 IoC는 어떤 문제를 해결하기 위해 나왔을까?IoC는 왜 생겼고 이걸 쓰면 뭐가 좋을까?구글을 찾아보니 IoC는 객체 간의 결합도를 낮추고 유지보수성과 테스트 용이성을 높이기 위해 고안되었다고 한다. 그럼 IoC는 어떻게 해당 문제를 해결할 수 있었을까? 먼저 결론을 얘기하자면 DI로 해당 문제를 해결하였다. 원래 객체는 스스로 협력 대상을 new로 만들고, 생명주기..
대댓글 페이지네이션
Computer Science/Spring Boot
이번 프로젝트에서 댓글-대댓글을 한꺼번에 페이징해야할 일이 생겼다. 한 번 쿼리문을 작성해봅시다...! 테이블 구성은 다음과 같다.어디서나 흔하게 볼 수 있는 댓글의 엔티티 구조! 처음엔 대댓글을 가져올 때 편하도록 양방향 매핑을 할까 고민을 했으나 성능을 고려하여 단방향 관계로 남겨두었다. 추가로 요구사항은 댓글의 최대 깊이를 1로 제한하고 있고 모바일 앱 기준으로 무한 스크롤 방식의 페이지네이션을 설계하려고 한다. 이제 한 번의 쿼리문으로 이 엔티티에서 댓글-대댓글을 페이지네이션을 하려고 하는데... 어떻게 쿼리문을 구성해야할지 열심히 고민하던 도중 아래 블로그에서 힌트를 얻을 수 있었다. https://velog.io/@lsvk9921/%EB%8C%93%EA%B8%80%EB%8C%80%EB%8C%9..