[MSA 3일차] - OpenFeign적용해서 RestTemplate과 차이 알기
·
MSA
이전 포스팅과 연관된 내용이 많기 때문에 참고용으로 올려두겠다. [MSA 2일차] - 스프링 클라우드로 MSA 구조 찍먹하기MSA에 대한 개념은 이전 포스팅을 참고 바란다.https://seungwon081.tistory.com/118 [MSA 2일차] - 스프링 클라우드 서비스 디스커버리 알아보자MSA구조로 프로젝트를 진행하면 무조건 듣는 필수 단어이다.seungwon081.tistory.com 📜OpenFeign이란?넷플릭스에서 만들어진 선언적인 HTTP Client 도구로써 외부 API를 쉽게 호출할 수 있도록 도와준다.선언적이란 어노테이션 사용을 의미하는데 OpenFeign은 인터페이스에 어노테이션만 붙여주면 구현이 되는 것이다. 이러한 방식은 JPA방식과 매우 유사하다고 한다.RestTemp..
스프링부트 - 스프링 시큐리티
·
Spring
스프링 시큐리티란?웹 애플리케이션에 인증과 권한 기능을 쉽게 적용할 수 있도록 도와주는 프레임워크이다.로그인, 로그아웃, 비밀번호 암호화, 권한별 페이지 제한, 자동 로그인, CSRF공격 방어 등에 유용하게 사용된다.@Configuration@SecurityFilterChain@UserDetailService등을 활용해서 설정하고 구현된다. 인증(Authentication) 과 인가(Authorization)보통 인증 절차를 거친 후 인가 절차를 진행한다.인증: 해당 사용자가 본인이 맞는지 확인하는 절차인가: 인증된 사용자가 요청된 자원에 접근가능한가를 결정하는 절차일단 스프링에서 스프링 시큐리티를 사용하려면 Maven이나 Gradle에 dependency> groupI..
스프링부트 - JWT(Json Web Token)이란?
·
Spring
JWT(Json Web Token)이란?인증 정보를 Json 형태로 담아 서버-클라이언트 간 안전하게 전달하기 위한 토큰이다.서버에서 발급하고 클라이언트에 저장토큰 자체에 사용자의 모든 정보를 포함하는 것이 가능하다.사용자의 정보가 변경되면 토큰을 재발급 받아야된다.JSON 데이터를 Base64 인코딩을 통해 직렬화JWT 구조.(dot)을 기준으로 헤더 내용 서명이 JWT토큰 하나를 이룬다.만약에 토큰이 완성되면 다음과 같은 형식을 따른다.Base64ASCII 중 제어 문자와 일부 특수 문자를 제외한 64개의 안전한 문자이다.Headertyp: 토큰 타입"JWT"alg(알고리즘): SHA-256, SHA-384, SHA-512 ECDSA(ES), HMAC(HS), ..
스프링부트 - 파일 업로드
·
Spring
파일 업로드에 들어가기 전에 핵심 인터페이스 MultipartHttpServletRequest를 알아야한다. HttpServletRequestHttpServletRequest는 ServletRequest의 자식 인터페이스이며, ServletRequest의 기능을 상속받아 확장하며, 이름과 같이 HTTP요청에 특화된 정보와 기능을 다루는데 사용된다. MultipartHttpServletRequestHttpServletRequest와 MultipartRequest를 상속받은 인터페이스이며,파일업로드와 일반적인 요청 데이터에 특화된 기능을 제공하는 인터페이스이다.public interface MultipartHttpServletRequest extends HttpServletRequest, MultipartR..
스프링부트 - 필터(FilterRegistrationBean)
·
Spring
Filter란?필터(Filter)는 스프링의 기능이 아닌 자바 서블릿진영에서 제공하는 기능이다. HTTp요청과 응답을 가로챈다.자바진영에서 제공하는 필터이므로 스프링의 DispatcherServlet보다 먼저 실행이 된다.AOP보다 Request와 response 객체에 쉽게 접근이 가능하다.FilterRegistrationBean을 통해 특정 URL에만 적용하거나 실행 순서를 제어할 수 있다.위 그림에서 스프링 영역의 Dispatcher Servlet에 들어가기전에 Filter가 실행이 되는 것을 확인 할 수 있다.필터(Filter)는 필터 체인을 통해 연쇄적으로 동작하게도 가능하다. Filter는 어디에 쓰일까?XSS(Cross Site Scripting) 방지(사용자로부터 들어오는 입력 데이터를 검..
[스프링부트] - 인터셉터(interceptor)
·
Spring
인터셉터(Interceptor)란?말 그대로 "어떤것을 가로챈다" 라는 뜻이다. 컨트롤러로 들어오는 요청(메서드(URI))에 접근하는 과정에서 무언가를 제어할 필요가 있을 때 사용이 된다. 정확히는 컨트롤러에 접근하기 전과 후로 나뉜다. Filter와의 차이점?인터셉터보다 필터가 먼저 동작한다.인터셉터는 필터와 다르게 메서드로 제어를 한다.Interceptor클래스 → 메서드로 제어를 하기 위한 클래스 파일InterceptorConfig클래스 → 어떤 URI에 대해서 동작할 것인지 설정을 위한 클래스 파일PostViewLogInterceptor.javapackage com.example.interceptor.interceptor;import jakarta.servlet.http.*;import lomb..
[스프링부트] - AOP에 대해서 알아보자
·
Spring
AOPAOP는 관점지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리해서 보는 프로그래밍이다.부가기능(공통적으로 적용될 기능)과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다. AOP의 목적관점지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰인다. AOP의 사용분야메소드의 성능 테스트트랜잭션 처리예외 반환로깅, 인증, 권한 처리 등한마디로 말해서 공통에 적용되는 시간 측정로직을 모든 파일에 넣어서 사용하는거보다 하나의 파일을 만들어서 시간측정로직을 적용하면 된다. → 따로 정리해서 일괄적으로 적용이 가능하다. AOP 적용 방식컴파일 시점AspectJ 컴파일러가 일발 .java파일을 컴파일할 때 가기능을 넣어서 .class파일로 컴파일해주는 것을의미한다. 이 동작을 Aspect와 실제 코..
[스프링부트] - Model 객체
·
Spring
우리는 저번에 Spring MVC를 알아봤다.View Model Controller로 이 세가지 구성요소를 보면 된다. Model 객체컨트롤러의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.Model객체는 key와 value로 이루어져있는 HashMap이다. @ModelAttribute와 차이점은?둘 다 메소드의 파라미터로 바인딩할 때 사용되지만 역할과 방식에 차이가 있다. 파라미터 레벨HTTP 요청 파라미터를 객체의 속성에 자동으로 매핑해주는 역할을 한다. 즉, 클라이언트가 보낸 데이터를 서버의 객체로 변환해주는 데이터 바인딩 기능이다.폼 제출 데이터를 객체로 받아서 처리할 때 유용메소드 레벨RequestMapping메소드가 실행되기 전에 특정 메소드를 실행하고, 반환 값을 자동으로..
[스프링 부트] -Spring JDBC
·
Spring
Spring의 데이터베이스 엑세스 방법은 크게 3가지가 있다.DAOMapperRepositoryData Access Layer에서 JDBC는 DAO를 이용하여 데이터베이스에 접근한다.DAO가 있기 위해서는 DTO가 있어야한다.DTO(Data Transfer Object) 컨트롤러와 뷰 그리고 비즈니스 계층간의 데이터 교환을 위한 자바 Bean이다.DTO는 따로 로직을 가지고 있지 않는 순수한 데이터 덩어리라고 보면 된다.Getter와 Setter를 만들어준다. DAO(Data Access Object)DAO는 단순히 CRUD만 하기 위한 객체이다.DAO에서 비즈니스 로직이 들어가면 안된다. 예를 들어 "주문 금액이 10만원 이상인 사용자의 목록을 가져와서, 각 사용자의 등급을 업데이트한다" 와 같은 로직..
[스프링 부트] - AJAX 요청 파라미터 전달
·
Spring
AJAX 요청으로 파라미터 전달하는법을 배웠다.get :경로 뒤에 ?를 붙여서 데이터 전post: FromData와 JSONData를 이용하여 데이터 전달 Form으로 데이터를 Post로 제출하기RegisterController.java@Controllerpublic class RegisterController { @GetMapping("/register") public String showForm() { return "register"; } @PostMapping("/register") @ResponseBody public String handleRegister( @RequestParam String name, @RequestParam String age, @Reques..