spring은 최초 java의 web application 로직을 가지고 있는 server application인 EJB(Enterprise JavaBeans) 사용의 어려움때문에 EJB를 사용하지 않고 web project를 더 쉽게 만들 수 있도록 Rod Johns
control과 view는 생각하지 않고 Model service 로직만 생각하여 예시를 들어보겠습니다.회원가입Model (class) 모델 객체를 만듭니다.Service (Interface) 인터페이스를 만들고ServiceImpl (class) 구현체를 만듭니다.co
AppConfig Spring 기반으로 변경기존의 AppConfig 파일을 Spring annotation을 사용하여 Spring Container로 등록합니다.Spring Container란ApplicationContext를 Spring Container라 부릅니다.
싱글톤이란?Web application은 일반적으로 다수의 사용자가 하나의 Server에 동시의 많은 요청을 하게됩니다. Singleton으로 디자인하지 않은 Web application의 java는 사용자의 요청마다 하나의 객체를 생성하게 되고 10,000건의 요청은
지금까지 빈을 등록하기 위해서 AppConfig class에 사용자가 일일히 @Bean으로 관리해주어야 했습니다. 하지만 이건 개발자에게 너무 귀찮은 작업이고 누락하게 되면 큰 장애가 발생하게됩니다. 그래서 Spring은 @Bean으로 일일히 등록하지 않아도 자동으로
의존관계 주입의 방법은 크게 4가지가 존재합니다.생성자 주입수정자(setter) 주입필드 주입일반 메서드 주입생성자 주입특징생성자 호출 시점에 1번만 호출되는 것을 보장합니다.불변, 필수 의존관계에 사용됩니다.만약 spring bean class에 생성자가 단 1개라면
Service로직을 구현하는 구현체 Bean도 있겠지만 web application에서 DB connection pool이나 socket과 같이 application 시작 시점에 미리 생성해두고 종료 시점에 종료시키는 작업을 진행해야하는 경우도 있습니다. spring에
http 기반으로 동작정적 리소스와 was에서 제공하지 않는 부가 기능들 제공HTML, CSS, JS, 이미지, 영상 등 정적 파일 로딩Apache, Nginxhttp 기반으로 동작정적 리소스 제공 가능프로그램 코드를 실행해서 어플리케이션 로직 수행tomcat, jet
서블릿이란 개발자가 HTTP 메세지로 통신할때 필요한 기본 과정들이 존재하는데 그 과정을 간소화 시켜주고 개발자는 핵심 비지니스 로직에 집중할 수 있게 도와주는 기능을 말한다.서블릿이 없을땐 위의 삭제된 과정들을 개발자가 직접 코드로 만들어야하는데 우리는 서블릿을 사용
GET - query parameterurl?name=이름&age=10메세지 바디 없이 url의 쿼리 파라미터를 사용하여 데이터를 전달검색, 페이징, 필터에 주로 사용됨POST - Formcontent-type: application/x-www-form-urlencod
HTTP Response에서 우리가 해야할 작업은HTTP 응답코드 지정헤더 생성바디 생성편의 기능 제공Content-Type쿠키Redirect다음과 같다. 그럼 코드로 위의 작업들을 어떻게 수행하는지 확인해보자.HTTP 응답코드 지정response.setStatus("
간단한 회원가입 어플리케이션을 만들기 위해 Member class를 만든다.Member 객체를 저장할 Repository를 생성하는데 실제 DB와 연결은 하지 않고 Map으로 휘발성 메모리로 사용한다. 하지만 일반 Map은 동시에 접속하여 사용했을때 문제가 되기 때문에
하나의 서블릿이나 JSP만으로 비지니스 로직과 뷰 렌더링까지 모두 처리하게 되면 유지보수가 어려워진다. 또한 뷰와 서비스 로직은 변경 사이클이 다르다. 예를 들어 화면이 변경됨에 따라 기능이 변경되지 않을 수 있고 기능이 변경됨에 따라 화면이 변경되지 않을 경우가 있기
spring하면 mvc 패턴의 framework로 잘 알고 있다. 하지만 이번에는 spring은 사용하지 않고 지금까지 공부한 servlet을 활용하여 mvc 패턴을 구현해보려고 한다.위 그림과 같이 기존의 MVC 패턴으로 구현한 Servlet은 client의 하나의
지금까지 만든 MVC 프레임워크와 실제 Spring 프레임워크를 비교해보자.지금까지의 구조를 잘 정리하고 이해했다면 우리가 만든 구조와 다른점이 거의 없다는 것을 알 수 있다. 위 그림과 아래 그림의 차이는 FrontController라는 이름 대신 Dispatcher
스프링은 어노테이션을 활용하여 매우 유연하고 실용적인 컨트롤러를 만들었는데 @ReqeustMapping을 사용하는 컨트롤러가 그것이다.@RequestMappingRequestMappingHandlerMappingRequestMappingHandlerAdapter핸들러
Spring에서의 요청을 알아보려고 한다. 먼저 매핑정보에 대해서 알아봐야하는데class 단위의 controller 설정@Controller : 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 렌더링된다.@RestController : 반환 값
응답 데이터를 만드는 방법도 크게 3가지이다.정적 리소스 : HTML, css, js 등 웹 브라우저에 정적인 데이터를 제공할 때뷰 템플릿 사용 : 웹 브라우저에 동적인 데이터를 제공할 때HTTP 메세지 사용 : HTTP API를 제공하는 경우 HTTP 메세지 바디에
지금까지 우리는 HTTP의 요청과 응답을 알아봤다. Spring에서 우리가 요청하는 내용과 응답하는 값들을 자동으로 설정을 해준다고 하는데 이것은 어떻게 작동하는 것일까? 그 자동으로 변환시켜주는 것이 HTTP 메세지 컨버터이다.HTTP API처럼 JSON 데이터를 H
메세지란 프로젝트의 HTML에 메세지가 하드코딩되어 있는데 이런 다양한 메세지를 한곳에서 관리하도록 하는 기능을 메세지 기능이라고 한다. 메세지 관리용 파일(ex. message.properties)을 만들고 파일에서 값들을 불러와서 사용하는 것이다. 국제화 메
사용자가 어플리케이션을 사용하며 어떠한 입력하는 동작에서 해당 값이 유효한 값인지 검사하는 것이다.검증을 직접 개발한다면 Map에 검증에 실패한 내용을 담아서 model로 넘겨야한다. 그리고 검증에 실패했을때 연결되는 페이지 또한 등록하는 페이지로 연결해야한다.여기서
📗 Spring이란 Spring이란 IoC(Inversion of Control)와 AOP(Aspect Oriented Programming)를 지원하는 경량 컨테이너 프레임워크이다. 경량이란 Spring은 가볍고 빠르며 여러개의 모듈로 구성되어 있어 각 모듈은
exception 프로젝트를 생성하자application.properties에서 해당 옵션을 false로 끈뒤 was에 exception이 던져졌을 때 어떻게 처리되어질지 확인해보자.해당 url로 요청하여 무조건 Exception을 던지도록 설계했고url로 요청시 다음
서블릿 예외처리에서 학습 했던 에러처리를 스프링 부트에서는 모두 기본으로 제공한다. /error라는 경로로 기본 오류 페이지로 설정해두고 예외가 발생하면 /error url을 기본으로 호출하게된다.우리가 등록했던 WebServerCustomizer의 @Component
스프링 부트에서 에러 페이지에 대한 처리는 매우 간단하게 처리되었고 사용자들에게 제한된 정보만 제공하기 때문에 크게 신경쓸 것이 없었다. 하지만 API의 경우 에러에 대한 JSON 데이터와 약속한 에러 응답 스펙으로 정의해서 반환해주어야한다. 스프링부트에서 기본으로
이전의 Exception이 발생하면 무조건 500 에러로 떨어졌지만 api의 경우 발생 예외에 따라 상태코드를 처리하고 싶다.코드와 같이 bad로 id값을 던졌을 때 IllegalArgumentException이 일어났지만 상태 코드는 500으로 나오는 것을 확인할 수
개인 프로젝트를 할때마다 로그인 api를 작성할 때 가장 먼저 적용시켰던 코드는해당 코드였다. 도대체 csrf가 뭐길래 disable 처리를 해주고 시작하는걸까? 라는 궁금증이 생겼다.CSRF란 Cross-Site Request Forgery로 번역하면 사이트 사이 위
저번 포스트에서 학습했던 HandlerExceptionResolver를 통해 예외 처리는 너무 복잡하고 코드도 너무 많았다. 그래서 Spring에서는 어노테이션을 통해 간단하게 적용할 수 있도록 도와주는데 해당 내용을 학습하려고 한다.스프링 부트에서 제공되는 Excep
역직렬화할 수 없는 객체 데이터가 존재한다는 것인데. 나 같은 경우에는 User 정보에서 Pw값을 넣어주지 않으려고 ResponseUser에서 Pw라는 변수를 필드에 선언하지 않았더니 다음과 같은 에러가 나왔다.해당 에러는 @JsonIgnoreProperties(ign
Type Converter란 쉽게 우리가 데이터를 파라미터로 받아서 사용할 때 중간에서 변환시켜주는 녀석을 말한다. 코드로 예를 들면다음과 같은 코드에 요청을 할경우 다음과 같이 integer를 얻을 수 있다. 하지만 타입을 String으로 받았다가 다시 Integer
ConversionService란 이전에 우리가 Convert Interface를 상속받아 구현했던 Converter들을 등록해서 사용할 수 있게 제공해주는 interface이다. 바로 사용해서 확인해보자.다음과 같이 테스트 코드를 작성하고 실행해보면다음과 같이 자동으
view controller를 생성하고html을 작성했다.그럼 화면에 다음과 같이 나온다. 여기서 중요한건 괄호가 {}와 {{}}로 표현된 곳의 차이인데. ipPort의 경우 하나는 객체의 주소값, 하나는 데이터 그대로 표현되었다. 이제 이유를 알아보자.thymelea
지금까지 학습한 Converter는 입력과 출력 타입에 제한이 없는 범용 타입 변환 기능을 제공한다. 하지만 개발자는 문자를 다른 타입으로 변환하거나, 다른 타입을 문자로 변환하는 상황이 대부분이다.ex) 1000이라는 int를 1,000으로 변경해주거나 날짜를 for
참고 spring boot release note
참고로 강의는 Intellij로 시작하지만 나는 VSC로 시작한다. 그 이유는 회사에서 VSC를 쓰기 때문... 나도 Intellij 쓰고 싶다... 팀 내에서 Java보다 node, python, ts 등 사용하는 언어들의 개발툴을 통일하다 보니 vsc가 제일 적합했
이전의 로그 추적기의 문제점은 TraceId값을 모두 동일하게(=동기화) 가져가기 위해 모든 메서드의 파라미터로 TraceId 값을 받아서 사용해야했다. 그럼 이후에도 모든 메서드를 생성할 때마다 파라미터가 기본 1개씩 추가되어야하는 일이 생기는데 이 부분을 해결할 수
배너가 무엇이냐... 처음 Spring Boot로 실행했을 때다음과 같이 Spring이라고 배너가 띄워진다. 이 부분을 변경해보려고 한다.배너를 생성해주는 사이트(https://patorjk.com/software/taag/다음과 같이 폰트와 문구를 지정한 뒤
이전에는 Redis를 사용하여 마스터 슬레이브 구조를 구성해보았다. 이 구조를 본 DB인 MySql에도 적용해보려고 한다. 참고 [Spring-boot] Master - Slave 구조에 따른 Read, Write 분기 🐳 Docker 🐋 Mysql 서버 생성
👏 Interceptor란? 웹에서 Request가 일어났을 때 > url request -> filter -> servlet -> interceptor -> controller -> service -> return 순서로 일어날 수 있다. 여기서 servlet
😂 어떤걸 성능 테스트하겠다고? MySql의 Master + Slave 구조에서 Spring의 DataSource를 선택하기 위해 Spring 자체에서 제공하는 RoutingDataSource와 각 Master의 DataSource와 Slave DataSource를
참고 갓대희 \[Spring] Filter, Interceptor, AOP 차이 및 정리우아한 기술 블로그 글을 보다가 AOP를 잘 사용하는 예제를 보게되어 AOP 사용법에 대해 정리해두려고 한다. 내 프로젝트에서도 많이 도움이 될거 같다.Aspect-Oriented
업무를 진행하며 filter, Interceptor에서 Request에 담긴 parameter와 body 값에서 금칙어를 확인해야할 일이 생겼다. 그래서 filter와 interceptor를 고민하다가 특정 url에서 금칙어 확인을 제외해주어야하는 부분이 있어 url
spring에서 api 요청시 들어오는 값들을 체크해주는 라이브러리이다. validation을 반복적으로 작성하지 않아도 되도록 도와준다!dto의 내용을 다음과 같이 @NotEmpty 와 @Size를 통해 에러 메세지도 미리 지정해줄 수 있다.테스트를 위해 다음과 같이
지난 validation AOP 적용하기 글에서는 간단하게 aop를 적용해보았는데. 실제로는 api 요청시에 많은 값들을 빼먹을 수가 있다! 그런데 하나씩만 반환해주면 api를 개발하는 개발자 입장에서는 하나씩 고쳐서 테스트해야된다... 이게 엄청 큰 시간 낭비를 불러
참고 달록의 Jacoco 적용기 (feat. Gradle)test code를 작성하면 툴에서 test coverage를 확인할 수 있다. 하지만 이는 나만 확인할 수 있고 커버리지 수치가 낮아도 별 상관이 없다. 그냥 내 눈에 보이는 수치일 뿐하지만 jacoco는 이를
📗 Spring Batch 5.0 이란? Spring Batch가 4.x 버전을 사용하다가 Spring Boot 3.0과 버전을 맞춘건지 5.0으로 업데이트를 했다. 기존의 방식대로 사용한다면 4.x 버전을 사용하면 된다. 하지만 토이프로젝트는 원래 새로운걸 도전해
출처 김영한 강사님의 Spring DB 1편트랜잭션은 데이터베이스에서 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 모든 작업이 성공해서 DB에 정상 반영하는 것을 Commit이라 하고 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 Rollback
spring에서 자체적으로 제공해주는 StopWatch 라이브러리로 간편하게 로직의 성능을 체크해볼 수 있다.위와 같이 객체로써 받아오면 끝이다.그리고 start와 stop으로 시간을 체크할 수 있다.위와 같이 stopWatch에 이름을 정해주고 start와 stop을