BindingResult
BindingResult를 통해 서버 사이드에서 검증할 때 MVC 패턴에서는 타임리프를 이용해 쉽게 error 메시지 출력이 가능했다. 그러다 프로젝트 중 요구사항이 변경되어 MVC가 아닌 Rest API 방식으로 검증 오류 메시지 출력이 필요해졌다. MVC에서의 BindingResult @PostMapping("edit") public Stri...
BindingResult를 통해 서버 사이드에서 검증할 때 MVC 패턴에서는 타임리프를 이용해 쉽게 error 메시지 출력이 가능했다. 그러다 프로젝트 중 요구사항이 변경되어 MVC가 아닌 Rest API 방식으로 검증 오류 메시지 출력이 필요해졌다. MVC에서의 BindingResult @PostMapping("edit") public Stri...
Exception의 종류 에러(Error) java.lang.Error 클래스의 하위 클래스들 Error는 메모리가 부족하다는 등과 같이 시스템이 비정상적인 상황인 경우에 발생 주로 JVM에서 발생해 애플리케이션 코드...
스프링의 ArgumentResolver를 이용해 로그인 세션을 확인하는 중복 로직을 줄여보자. 기존 로직 @GetMapping("/") public String homeController( @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member l...
DTO에 대해 처음 공부했을 때 각 요청마다 DTO를 분리하는 이유가 단순히 로직 수행에 필요없는 데이터가 dto 객체에 같이 돌아다니기 때문이라고 생각했다. 하지만 시간이 지나 @Validated와 BindingResult 등 검증에 대해 공부하다보니 , 위와 같은 이유도 분명히 있지만 왜 각 요청마다 DTO를 분리해야하는지 깨닫게 되었다. It...
HTTP 프로토콜 등장 이전 IP 프로토콜 지정한 IP 주소에 데이터 전달 IP 주소가 담겨있는 IP 패킷에는 출발지 IP, 목적지 IP 등의 정보가 담겨있다 패킷을 통해 데이터 전달 한계 비연결성 : 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 비신뢰성 : 중간에 패킷이 사라지...
싱글톤(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...