SpringBootJpa 개발 | 7 DAY - 2

하다가 막히는 부분이나 알아야 할 사항, 혹은 버전의 문제 등을 적기 위한 간단한 노트이며

이는 공부용 소스이기 때문에 소스에 주석을 달아가며 설명을 적어뒀습니다.
따라서 해당 날짜의 소스를 보며 노트를 참고하는 식으로 봐야합니다.

소스는 깃헙에 올려놓았습니다.

@AuthenticationPrinciple

기본 루트로 접근하는 사람의

@GetMapping("/")
public String home(@CurrentUser Account account, Model model){  
    if(account != null){  
        model.addAttribute(account);  
    }  
    return "index";  
}

AccountController 에서 @PostMapping("/sign-up") 매핑으로 들어온 요청에 대해 accountService.login(loginAccount);를 실행하고

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(  
    new UserAccount(account)  
    ,account.getPassword()  
    , List.of(new SimpleGrantedAuthority("ROLE USER"))  
);

이렇게 UsernamePasswordAuthenticationToken을 만들어줄 때 token 생성자에 new UserAccount(account)를 넣어주고

Error in @AuthenticationPrinciple

anonymousUser 오타를 내면

@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")

해당 에러가 남

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'account' cannot be found on object of type 'java.lang.String' - maybe not public or not valid?

Error

2022-08-08 11:14:26.431 ERROR 7952 --- [nio-8080-exec-5] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-5] Exception processing template "index": An error happened during template parsing (template: "class path resource [templates/index.html]")

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/index.html]")

…? 한참을 이리저리 살펴보다가… 한 30분 태웠는데.. 아래 코드에서 첫번째는 위 에러를 뱉고 두번째는 정상작동합니다..

<div class="alert alert-warnning" role="alert" th:if="${account!=null && !acoount.emailVerified}">
<div class="alert alert-warnning" role="alert" th:if="${account != null && !account.emailVerified}">

어노테이션 정리

에러를 해결하고 나서 어노테이션 정리

@Retention

커스텀 어노테이션을 생성할 때 주로 사용하는 어노테이션 왜 커스텀 어노테이션을 생성할 때 사용하는데..?

RetentionPolicy를 파라미터로 받음

@Documented  
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.ANNOTATION_TYPE)  
public @interface Retention {  
    RetentionPolicy value();  
}

RetentionPolicy 는 enum의 형태로 3가지 값 제공

public enum RetentionPolicy {  
	SOURCE, CLASS, RUNTIME  
}

@Reention을 붙인 해당 객체가 메모리에 존재할 수 있는 기간을 정의 SOURCE 는 컴파일러가 컴파일하면서 버립니다 CLASS 는 클래스가 살아있는 동안 RUNTIME 은 애플리케이션이 활동하는 동안

@AuthenticationPrincipal


<a th:href="@{/check-email}" class="alert-link">계정 인증 이메일을 확인</a>하세요.

여기서 /check-email로 넘어오는 과정에 form 데이터를 보낸다던가 한 것이 아닌데도 데이터가 잘 오가는걸 보면

@GetMapping("/check-email")  
public String checkEmail(@CurrentUser Account account, Model model){  
  model.addAttribute("email", account.getEmail());  
  return "account/check-email";  
}

아래 코드에 뭔가 동작하는게 따로 있구나 싶었습니다. @CurrentUser Account account

https://shirohoo.github.io/spring/spring-security/2022-03-31-mvcMatchers/ https://github.com/shirohoo/sample-spring-security-login https://shirohoo.github.io/spring/spring-security/2021-08-30-http-login/

댓글남기기