[TIL] 3월 5일

yeon·2021년 3월 5일
0
  • 브라우저에서는 잘 동작하는데 IDE에서는 에러가 뜬다.

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by com.github.jknack.handlebars.context.MemberValueResolver (file:/Users/kimnayeon/.gradle/caches/modules-2/files-2.1/com.github.jknack/handlebars/4.2.0/116306614fd4d250af27fe1ef48665e7830fc10b/handlebars-4.2.0.jar) to method java.util.Collections$EmptyMap.isEmpty()
    WARNING: Please consider reporting this to the maintainers of com.github.jknack.handlebars.context.MemberValueResolver
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release

→ 슬랙에 파이로가 같은 문제를 마주한걸 올렸는데 제인이 얘기해준대로 자바 8로 설정하니 해결

Spring Bean, configuration

아래 블로그 참고

[SpringBoot] @Bean, @Configuration, @Component 어노테이션

Spring Bean이란?

  • 스프링의 DI container에 의해 관리되는 POJO(Plain Old Java Object)
  • 스프링 어플리케이션을 구성하는 핵심 객체

Spring Bean 구성 요소

  • class: Bean으로 등록할 자바 클래스
  • id: Bean의 고유 식별자
  • scope: Bean을 생성하기위한 방법(sigleton, prototype 등)
  • constructor-arg: Bean 생성시 생성자에게 전달할 파라미터
  • property: Bean 생성시 setter에 전달할 인수

@Configuration어노테이션

  • 클래스를 Bean으로 등록시 @Configuration어노테이션을 붙여서 해당 클래스에서 Bean을 생성한다는 것을 명시해준다.
  • @Bean 어노테이션을 사용하는 클래스는 @Configuration 어노테이션을 함께 써줘야함

@Bean 어노테이션

  • 개발자가 직접 제어 불가능한 라이브러리를 활용할때 사용
  • 설정을 위한 클래스를 Bean으로 등록할때 사용

@Component 어노테이션

  • 개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우

URL과 html 간단히 연결하기

@Configuration
public class MyConfig implements WebMvcConfigurer {

    public void addViewControllers(ViewControllerRegistry registry){
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);

        registry.addViewController("/user/create").setViewName("user/form");
        registry.addViewController("/user/login").setViewName("user/login");
        registry.addViewController("/qna/create").setViewName("qna/form");
    }
}
  • 특별한 로직 없이 url과 html을 연결할때 @Controller에서 일일히 @GetMapping 메소드를 생성할 필요없이 @Configuration에서 간단히 구현할수 있다.

마주한 문제

회원가입 부분에서 form 양식을 기입하면 PostMapping 이 잘 동작했는데 미션1을 진행하다가 405 에러가 떴다. 구글링하면 해당메소드에 Post 방식을 추가해주고 form태그에서 method랑 action 속성 지정해주는 이야기만 있는데 이부분은 이전에 잘 지정해줘서 문제가 없는 부분이고, 시큐리티 이야기도 있는데 내게 해당되는 내용은 아닌거같았다. 원인이 뭔지 모르고 헤매다가 그룹에 공유를 했는데 조원분들이 도와줘서 해결되었다.

원인은 MyConfig 클래스에서 아래 url과

registry.setOrder(Ordered.HIGHEST_PRECEDENCE);

registry.addViewController("/users/create").setViewName("user/form"); 

UserController 클래스의 아래 부분의 url이 겹쳐서 발생한 문제였다.

@PostMapping("/users/create")
public String create(User user) {
    System.out.println("user : " + user);
    users.add(user);
    return "redirect:/users";
}
  • 위에 코드의 registry.setOrder(Ordered.HIGHEST_PRECEDENCE);

    이 부분이 순서를 지정해주는 건데 @Controller 부분보다 제일 먼저 실행된다는 의미여서 발생한 문제였다. 정확히 설명하지는 못하겠지만 대충 어떤 느낌인지 감으로만 알겠다.

  • @PostMapping 애노테이션에 써주는 URL은 html파일의 form태그의 action 에 써주는 URL과 연결되는 것이다. 해당html에서 받은 데이터를 서버로 전송하는게 post 방식인가보다.

html에서 템플릿 엔진 문법은 무조건 {{ }} 중괄호 두개로 감싸주기

모든 view를 접근할때는 무조건 controller를 통해서 접근해야한다.


오늘 한일

  • HTML block/partial 문법 이용해서 중복제거, 문법이 처음에 이해가 안가서 이거 하나 하는데도 한참 걸렸다....
  • MyConfig 클래스 생성하고 나서 에러가 발생해서 삽질하다가 조원들 덕분에 해결했다.
  • 질문하기, 목록, 상세보기까지 구현 완료
  • 회원정보를 수정하는 부분 혼자 해보다가 잘 안되서 동영상보고 따라했다. 데이터베이스 연동하는 부분을 아직 안해서 id를 String으로 된 index로 바꿔서 구현하니 회원이 하나 더생기는 문제가 발생한다.
    • 그냥 데이터베이스까지 다 듣고 따라하고 PR날려야겠다.
    • 처음에 데이터베이스의 id 사용대신 String id로 했는데 500에러가 뜬다. id는 정해진게 있어서 변수로 쓰면 안되는건가. 혹시나하고 index로 변경해보니깐 에러가 해결되었다.
  • 속도가 많이 더딘거 같은데 주말에도 열심히 해야겠다.

2개의 댓글

comment-user-thumbnail
2021년 3월 23일

연선생님 구글검색으로 타고들어왔습니다

Illegal reflective access by com.github.jknack.handlebars.context.MemberValueResolver

해결책 공유 감사합니다

1개의 답글