![[whatssue] 스프링 인터셉터를 사용해 사용자 권한 체크하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzrQB1%2FbtsGFl2Qy7m%2FmfkjhC7tRfjSS52uvSkAxK%2Fimg.png)
문제 상황모임 관리 프로젝트의 모임 관련 api를 개발하다가 다음과 같은 문제를 직면했다.1. 매번 club이 존재하는지 체크해주어야한다.2. 매번 로그인 유저가 이 club의 멤버인지 체크해주어야 한다.3. 매번 로그인 유저가 이 club의 관리자인지 체크해주어야 한다. (관리자 api인 경우)4. 매번 로그인 유저가 이 club에 가입 이후 처음 방문했는지 체크해주어야 한다. 클럽에 관련된 api마다 1, 2, 3, 4의 중복 코드가 발생한다. 해결방안중복되는 공통 관심사를 한번에 처리하고자 하였다.조금 찾아보니 필터, 스프링 인터셉터, AOP 로 공통관심사를 처리할 수 있었고,나는 스프링 인터셉터(Spring Interceptor)를 사용하여 이번 문제를 해결하고자 하였다. 스프링 인터셉터란 ?스..
![.properties 파일 인코딩 문제 해결](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ5Qq4%2Fbtso8zkDTda%2FJCxM1onzp9zZ2FNVg15us0%2Fimg.png)
스프링의 메시지 소스와 국제화 기능에 대해 학습하던 중다음과 같은 문제가 발생했다. locale 정보를 주지 않았기 때문에 디폴트 값인 messages_ko.properties를 우선 조회할 것이고,해당 파일또한 존재하지 않기 때문에 messages.properties를 조회할 것이다. 다음과 같이 테스트 실패. 테스트 실패와 함께 messages.properties의 한국어가 ??로 바뀌어있는 것을 확인했다. 우선 아래와 같이 영어로 바꾸어보았더니 정상적으로 테스트가 성공하는 것을 확인하였다. 확실하게 인코딩 문제임을 확신했고 인텔리제이 settings에서 encoding 관련 설정을 찾아보았다. Properties Files의 인코딩 설정 .properties 파일의 인코딩 설정을 UTF-8로 변경..
![[Spring] Spring 프로젝트 생성 및 설정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMGCl%2Fbtr3gO99Y71%2FRaJQmlm5dlZrJva7II7BT1%2Fimg.png)
♪ 학습 내용 Spring Initializr 를 이용한 프로젝트 생성 및 설정 Spring Initializr 를 이용해 몇초만에 새로운 Spring 프로젝트를 생성할 수 있다. https://start.spring.io/ Gradle - Groovy 선택 Java 선택 SNAPSHOT 등 영어 붙은 버전 말고 가장 최신 버전 선택 (3.0.4) Group : 기업명 / 자유롭게 작성 artifact == name : 빌드결과물 이름 Dependencies 에 사용할 라이브러리를 추가해주었다. GENERATE 클릭 / 압축 풀기 스프링 부트 3.0 이후부터는 자바 17이 필수이기 때문에 이런 에러 발생하는 것.
![[Spring MVC 1] 스프링 MVC 웹 페이지 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC787e%2FbtrZLUTeV4s%2FAPrXntCppvn1Xk0K5ig6Y1%2Fimg.png)
♪ 학습 내용 Spring MVC 기반 웹 페이지 만들기 (완) HTML/CSS/JS 프레임워크인 부트스트랩 사용하기 위해 부트스트램 파일 설치. spring 프로젝트 생성 시 뷰 템플릿인 타임리프 / 롬복 포함시키기. * 전체적인 흐름 * 시작 상품 도메인 모델 Item ( ID / 이름 / 가격 / 수량) @Repository 애노테이션 내부에는 @Component 가 포함되어 있어 컴포넌트 스캔 대상이 된다. 상품 저장소 로직 테스트 완료 롬복--> @RequiredArgsContructor 애노테이션 --> final 붙은 멤버변수를 사용해 생성자 생성 생성자 하나 있을 때 의존관계 생성자 주입은 @AutoWired 생략가능 따라서 컨트롤러는 ItemRepository를 생성자 주입 받고 있다. ..
![[Spring MVC 1] 스프링 MVC-기능 (4)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4hyAu%2FbtrZoqF7By0%2FuuYSkVIvp28WfSgHREEwk0%2Fimg.png)
♪ 학습 내용 HTTP 응답 / HTTP 메시지 컨버터 * HTTP 응답 스프링에서 응답 데이터를 만드는 방식은 총 3가지이다. ( 정적 리소스 / 뷰 템플릿 사용 / HTTP 메시지 ) 정적 리소스 정적 리소스는 말 그대로 웹 브라우저에 정적 HTML CSS JS를 제공할 때 사용되는 것이다. 파일을 변경하지 않고 그대로 서비스하기 때문에 웹 브라우저 url 경로 입력하고 바로 실행하면 된다. 마치 src/main/resources/static/index.html 처럼. 뷰 템플릿 스프링이 제공하는 뷰 템플릿의 기본 경로는 다음과 같다. src/main/resources/templates ModelAndView를 생성하며 논리 이름을 넘겨 뷰 템플릿을 호출하거나 , Model에 데이터를 담고 논리 이름..
![[Spring MVC 1] 스프링 MVC-기능 (3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcomZ8n%2FbtrYRVmZ6zR%2FOmCKyACRM3YI1qXwjzr6Y1%2Fimg.png)
♪ 학습 내용 스프링 MVC - HTTP 요청 메시지( 텍스트 / json ) 조회 * HTTP 요청 메시지 조회 - 단순 텍스트 HTTP 요청 메시지 바디에 직접 데이터를 담아 요청하면, 앞에서 학습한 @RequestParam 이나 @ModelAttribute 를 사용할 수 없다. (두 애노테이션은 요청 파라미터를 조회하는 방식이기 때문!) 그렇기 때문에 서블릿 학습 때 처럼 inputStream을 받아, StreamUtils를 이용해야한다. StreamUtils를 이용해 바이트 코드인 inputStream을 UTF-8로 변환. (InputStream inputStream, Writer writer) InputStream은 request, response 를 파라미터로 받지 않고 바로 요청 메시지 바디..
![[Spring MVC 1] 스프링 MVC-기능 (2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7zkgl%2FbtrYzllplo5%2FmWNhx0WlwXmctNrtAHflP1%2Fimg.png)
♪ 학습 내용 스프링 MVC - HTTP 요청 파라미터 조회 * HTTP 요청 헤더 조회 HttpMethod => HTTP 메서드를 조회한다. ex) GET , PUT ,,, 등 Locale => Locale정보를 조회한다. ex) ko_KR , en_US ,,, 등 @RequestHeader @RequestHeader MultiValueMap headerMap 모든 HTTP 헤더를 MultiValueMap형식으로 조회 MultiValueMap은 Map과 유사하며, 하나의 키에 여러 값을 받을 수 있다 ! 따라서 MultiValueMap에서 여러 값이 저장된 키 하나를 조회하면 해당 값들이 속한 List 배열로 반환한다. @RequestHeader("host") String host 특정 HTTP 헤더를..
![[Spring MVC 1] 스프링 MVC-기능 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc46FFK%2FbtrYhbqqaF4%2FEs24XjOro6fSrpy3wHoAWk%2Fimg.png)
♪ 학습 내용 스프링 MVC의 기본 기능 이번엔 JSP를 사용하지 않기 때문에 프로젝트 생성 시 Jar를 선택해주었다. Jar : 항상 내장 서버 사용, webapp 경로 사용x ----> 내장 서버 사용에 최적화 * 로깅 //로그 선언 private Logger log = LoggerFactory.getLogger(getClass()); //치환된다 log.deug("data={}",data); @Slf4j 장점으로는 로그를 사용하면 로그를 상황에 맞게 설정으로 조절할 수 있고, ( ex 개발 서버에는 모든 로그 출력, 운영 서버에는 출력하지 않는 로그) System.out 방식은 콘솔에 출력하는 것이 전부였지만 로그는 파일이나 네트워크 등 별도의 위치에 남길 수 있다. * 요청 매핑 @RestCont..
![[Spring MVC 1] 스프링 MVC-구조 (2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCElIf%2FbtrX3sjUu8T%2FiAGTq3pvsHpCELxk7fvguK%2Fimg.png)
♪ 학습 내용 스프링 MVC 시작 * 스프링 MVC 시작하기 전에는 Controller 인터페이스를 구현한 컨트롤러로 개발했지만 스프링이 제공하는 컨트롤러는 애노테이션을 기반으로 훨씬 더 편리하게 개발 가능하다. @Controller 1. 스프링 빈으로 등록 ( 내부에 @Component가 포함되어 있다) 2. 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식 @RequestMapping 요청 정보를 매핑한다. 해당하는 URL이 호출되면 이 메서드 호출! 이 애노테이션이 있으면 RequestMappingHandlerMapping / RequestMappingHandlerAdapter 이 두 객체가 사용된다. (우선순위 제일 높음) 현재 실무에서는 이 방식의 컨트롤러를 사용 RequestMappingHan..
![[Spring MVC 1] 스프링 MVC-구조 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLmW0G%2FbtrXWyd5A1p%2Fiet6zC8mmUsil4A3v8kORK%2Fimg.png)
♪ 학습 내용 스프링 MVC의 전체 구조 이해 * 스프링 MVC 구조 스프링 MVC의 전체 구조는 다음과 같다 앞서 개발해온 MVC 프레임워크와 구조가 매우 유사한 것을 확인했다. 요청이 들어오면 핸들러 매핑에서 돌면서 핸들러를 찾고, 핸들러 어댑터 목록에서 돌면서 핸들러를 처리가능한 어댑터를 찾는다. 어댑터를 통해 핸들러 실행되고, ModelAndView 반환되고 논리 이름으로 뷰 리졸버 --> 실제 뷰 반환 렌더 호출해서 뷰 렌더링 된다. 스프링 MVC의 프론트 컨트롤러이자 핵심이 바로 DispacherServlet. DispacherServlet은 부모 클래스에서 HttpServlet을 상속 받는다. 스프링 부트는 내장 톰켓을 띄우면서 이 DispacherServlet을 바로 서블릿으로 등록한다. ..