타임리프
타임리프는 백엔드 서버에서 HTML 파일을 동적으로 렌더링하는 용도로 사용된다.
자세한 내용은 타임리프 게시글에서 확인
메세지, 국제화
만약에 상품명이라는 단어를 상품이름으로 변경하려면 어떻게 해야할까? 하나하나 찾아서 변경하는 방법을 취할 수 밖에 없다. 이러한 문제를 해결하기위해 값들을 한 곳에서 관리하도록 하는 기능을 메세지 기능이라고 한다.
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 정리
로그인 처리 - 쿠키
로그인시 로그인 상태를 유지시켜주는 기술이 필요하다. 계속해서 파라미터로 데이터를 유지하면서 보낼 수 있지만 매우 번거롭다. 또한 페이지에 들어갈 때마다 사용자 정보를 포함시키기에는 무리가 있다. 이런 문제를 해결하기 위해 쿠키를 사용한다 ! 모든 요청에 쿠키 정보를 자동으로 포함시켜서 보내준다.
쿠키 개념 정리
https://mjcoding.tistory.com/entry/HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D
로그인 처리 V 정리
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());
}
}
스프링의 예외처리
스프링 예외 처리 정리
스프링 타입 컨버터
스프링 타입 컨버터 정리
'웹 개발' 카테고리의 다른 글
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 |