스프링 기본편
싱글톤(Singleton) 스프링은 기본적으로 객체를 싱글톤으로 관리한다. 스프링 컨테이너가 없다면 요청 당 하나의 객체를 새로 생성해야되기 때문에 메모리 낭비가 심하다. 그렇기에 스프링은 객체를 딱 1개만 생성되고, 그 객체를 공유하도록 설계되어있다. 이것을 싱글톤이라고 한다. 하지만 일반 싱글톤 패턴은 여러 문제가 있다. 싱글톤 패턴 문제...
싱글톤(Singleton) 스프링은 기본적으로 객체를 싱글톤으로 관리한다. 스프링 컨테이너가 없다면 요청 당 하나의 객체를 새로 생성해야되기 때문에 메모리 낭비가 심하다. 그렇기에 스프링은 객체를 딱 1개만 생성되고, 그 객체를 공유하도록 설계되어있다. 이것을 싱글톤이라고 한다. 하지만 일반 싱글톤 패턴은 여러 문제가 있다. 싱글톤 패턴 문제...
프로젝트에서 OAuth2를 사용해 로그인을 구현하다보니 알지 못했던 RestTemplate과 WebClient에 접했다. 이에 대해 공부하다보니 스프링 부트에서 지원하는 Webflux에 대해 알게 되었고 공부한 것을 정리한 글이다. Webflux Spring Framework 5부터 지원하는 반응형 웹 애플리케이션을 구축하기 위한 프레임워크...
WebFlux에 대해 공부하다 Publisher와 Subscriber에 대해 좀 더 자세히 공부하고 싶어 정리한 글이다. Publisher - Subscriber 패턴 spring mvc로 동기식 개발을 할 때는 메서드 호출만 하면 결과값이 return 됐었다. 그러나, reactive하게 동작하는 WebFlux에서는 메서드만 호출해서는 아무...
DTO, VO, Entitiy에 대해 공부하다보니 뭔가 VO에 대한 개념이 잘 잡히지 않았다. 그래서 추가로 VO에 대해 찾아봤고 어느정도 개념이 잡힌 것 같다. Intro VO는 많은 사람들이 DTO와 혼용하는 경우가 많다. 하지만 DTO와 VO는 각기 다른 역할을 가지고 있다. DTO : 객체 간의 데이터 교환을 위한 객체 VO ...
Controller에 회원 기능을 추가하고 그에 맞는 View를 추가해 화면을 구현하자 Controller package hello.hellospring.controller; import hello.hellospring.domain.Member; import hello.hellospring.domain.MemberForm; import hello...
프로젝트를 진행하면서 DTO와 VO, Entity에 대해 제대로 이해하지 못한 상태에서 DB에 있는 테이블을 토대로 클래스를 만들려다다보니 어려움이 있었다. 여러 블로그를 참고해 어느정도 정리가 된 느낌이라 바로 블로그에 작성하려고 한다. 회원의 데이터를 저장하는 VO 클래스를 만들다보니 DB 칼럼과 클래스 변수들이 1대1로 매칭되는 것이 맞는건지...
전 포스팅에서 우리는 직접 MemberService에 생성자를 만들어 DI를 통해 MemberRepository를 주입했었다. 하지만 스프링에서는 사용자가 직접 DI를 구현할 필요없이 개발자의 편의를 위해 스프링 컨테이너가 관리해준다. 뿐만 아니라 스프링 컨테이너에 객체를 등록하면 해당 객체를 관리해주는 기능을 제공한다. 이때 컨테이너에 객체를 ...
Test package hello.hellospring.service; import hello.hellospring.domain.Member; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; import static ...
스프링 웹 개발에는 크게 세가지 방법이 있다. 정적 컨텐츠 MVC와 템플릿 엔진 API 이 세가지 방식에 대해 알아보자. 정적 컨텐츠(Static Content) 정적 컨텐츠 서버에서 파일을 그대로 웹브라우저에게 보내는 것을 의미한다. 스프링 부트는 기본적으로 정적 컨테츠를 제공한다. resources/static 폴더가 있는데...
Member에 사용될 비즈니스 로직을 가진 Service 클래스를 만들어보자. MemberService package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import ...