타임리프
타임리프는 백엔드 서버에서 HTML 파일을 동적으로 렌더링하는 용도로 사용된다.
자세한 내용은 타임리프 게시글에서 확인
스프링 MVC 2편 - 타임리프
타임리프란? 타임리프는 백엔드 서버에서 HTML 파일을 동적으로 렌더링하는 용도로 사용된다. 타임리프를 사용하면 작성한 파일은 HTML을 유지하기 때문에 파일을 직접 열어서도, 뷰 템플릿을 거
mjcoding.tistory.com
메세지, 국제화
만약에 상품명이라는 단어를 상품이름으로 변경하려면 어떻게 해야할까? 하나하나 찾아서 변경하는 방법을 취할 수 밖에 없다. 이러한 문제를 해결하기위해 값들을 한 곳에서 관리하도록 하는 기능을 메세지 기능이라고 한다.
MessageSource 직접 등록
메세지 관리 기능을 사용하기 위해서는 MessageSource의 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하면 된다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new
ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- basenames : 설정 파일의 이름을 지정, 국제화 적용시 마지막에 언어 정보를 제공하면 된다. ex) message_en.properties
- message.properties (언어 정보가 없는 파일명)을 기본으로 사용한다.
스프링 부트사용 시 메세지 설정
스프링 부트 사용 시 자동으로 MessageSource를 자동으로 스프링 빈으로 등록해준다.
특징
- application.properties에서 메세지 소스를 설정할 수 있다.
- 별도의 설정을 하지 않으면 messages라는 이름으로 등록된다.
- 스프링 부트 메세지 소스 기본 값은 message가 아니라 messages이다!
- 국제화 사용 : messages_en.properties 처럼 뒤에 설정할 언어를 붙여 파일을 생성하면 된다.
spring.messages.basename=messages // 기본값 생략 가능
메세지 사용
타임리프의 메세지 표현식 #{...}를 사용하면 메세지를 쉽게 적용할 수 있다.
ex) html
<label th:text="#{label.item.id}">상품 ID</label>
<label th:text="#{label.item.itemName}">상품명</label>
ex) messages.properties
기본 설정으로 message.properties에서 설정한 메세지가 화면에 적용된다.
label.item=상품
label.item.id=상품 ID
....
ex) messages_en.properties
영어를 기본언어로 선택하면 Accept-Language에서 en 값을 서버로 넘겨 messages_en.properties에서 설정한 메세지가 화면에 적용된다.
label.item=Item
label.item.id=Item ID
....
검증
여태까지 만든 웹 애플리케이션은 폼 입력 시 숫자칸에 문자를 입력했을 때 검증 오류가 발생하면서 400 오류화면이 보여진다. 이렇게 되면 사용자는 코드에러에 당황할 뿐만 아니라 처음부터 폼에 값을 다시 입력해야한다.
웹 서비스는 폼 입력 시 오류가 발생하면 어떤 부분이 오류가 났는지, 고객이 입력한 데이터를 유지한 상태에서 알려줘야한다.
검증 V1 ~ V6 까지 단계적으로 검증을 하는 방법을 정리하였다.
검증 V 정리
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 검증
검증 여태까지 만든 웹 애플리케이션은 폼 입력 시 숫자칸에 문자를 입력했을 때 검증 오류가 발생하면서 400 오류화면이 보여진다. 이렇게 되면 사용자는 코드에러에 당황할 뿐만 아니라 처음
mjcoding.tistory.com
로그인 처리 - 쿠키
로그인시 로그인 상태를 유지시켜주는 기술이 필요하다. 계속해서 파라미터로 데이터를 유지하면서 보낼 수 있지만 매우 번거롭다. 또한 페이지에 들어갈 때마다 사용자 정보를 포함시키기에는 무리가 있다. 이런 문제를 해결하기 위해 쿠키를 사용한다 ! 모든 요청에 쿠키 정보를 자동으로 포함시켜서 보내준다.
쿠키 개념 정리
https://mjcoding.tistory.com/entry/HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D
HTTP 웹 기본 지식
인터넷 네트워크 IP Internet Protocol IP(인터넷 프로토콜) : 인터넷을 통해 데이터를 주고받을 때 사용하며 지정한 주소에 패킷 단위로 데이터를 전달 IP 패킷 정보 : (출발지 IP + 목적지 IP) + 데이터 IP
mjcoding.tistory.com
로그인 처리 V 정리
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 로그인 처리
로그인 처리 V1 - 쿠키 직접 생성쿠키를 직접 생성하고 값을 HttpServletResponse를 통해 저장하는 방식을 사용하였다. LoginControllerV1 - login에 적용로그인 성공 시 쿠키를 생성하고 HttpServletResponse에 담
mjcoding.tistory.com
ArgumentResolver 활용
스프링에서는 직접 애노테이션을 만들어서 사용할 수 있다. 예시로 @Loign 애노테이션을 생성해보겠다.
HomeController - homeLogin 에 ArgumentResolver 적용 전
@GetMapping("/")
public String homeLogin(@SessionAttribute(name = SessionConst.LOGIN_MEMBER,required = false) Member member, Model model){
//세션에 회원 데이터가 없으면 home
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
HomeController - homeLogin 에 ArgumentResolver 적용 후
@Login 애노테이션을 생성하여 코드를 훨씬 간결해졌다.
@GetMapping("/")
public String homeLogin(@Login Member loginMember, Model model) {
//세션에 회원 데이터가 없으면 home
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
적용 순서 1 - @Login 애노테이션 생성
@Target(ElementType.PARAMETER) // 파라미터에만 적용
@Retention(RetentionPolicy.RUNTIME) // 리플렉션을 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음
public @interface Login {}
적용 순서 2 - HanlderMethodArgumentResolver 구현
@Login 애노테이션을 직접 만들어보자 @Login 애노테이션이 있으면 ArgumentResolver가 동작하여 자동으로 세션에 있는 로그인 회원을 찾아주고 세션이 없으면 null을 반환한다.
@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter 실행");
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
log.info("resolveArgument 실행");
HttpServletRequest request = (HttpServletRequest)
webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) {
return null;
}
return session.getAttribute(SessionConst.LOGIN_MEMBER);
}
}
- supportParmeter () : @Login 애노테이션이 있으면서 Member에 해당하는 타입이면 ArguementResolver를 사용
- resolveArgument() : 컨트롤러 호출 직전에 호출되어서 필요한 파라미터를 생성해준다. 여기서는 로그인 회원 정보는 Member 객체를 찾아서 반환해준다.
적용 순서 3 - webMvcConfigurer에 설정 추가
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginMemberArgumentResolver());
}
}
스프링의 예외처리
스프링 예외 처리 정리
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 예외 처리
서블릿의 예외 처리와 오류 페이지스프링이 아닌 순수 서블릿 컨테이너에서의 예외처리 방법은 2가지 방식이 있다. 1. Exception (예외)2. response.sendError(HTTP 상태 코드, 오류 메세지) Exception 예외
mjcoding.tistory.com
스프링 타입 컨버터
스프링 타입 컨버터 정리
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 스프링 타입 컨버터
스프링 타입 컨버터문자를 숫자로 변환하거나, 숫자를 문자로 변환하는 과정을 스프링 MVC 에서는 편리하게 지원해준다. ex) 데이터 타입 변환: 문자열을 정수로 변환 일반적인 컨버터 방법HTTP
mjcoding.tistory.com
'웹 개발' 카테고리의 다른 글
intellij 단축키 (0) | 2024.04.16 |
---|---|
스프링 DB 1편 - 자바 예외 처리 (0) | 2024.03.04 |
스프링 DB 1편 - 데이터 접근 핵심 원리 (0) | 2024.02.24 |
스프링 MVC 2편 - 타임리프 (0) | 2024.02.23 |
스프링 MVC 1편 (0) | 2024.01.23 |