![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bSdLPs/btsbQyxJ38r/yBbAE4ANLfY6OLRG9cRaz1/img.png)
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Indexed public @interface Component { String value() default ""; } 스프링에서 제공하는 Component를 보자. 스프링은 @Component를 등록하여 bean을 만드는 방법이 있다. 스프링은 ComponentScan으로 Component가 달려있는 Service, Repository 등을 스캔한다. 나는 이게 궁금했다. 이 Component에 대한 의구심이 들었고 그 전에 어노테이션은 어떻게 만드는지 부터 확인할 필요가 있었다. @Documented : Java doc에 문서화 여부를 결정 @Retention : ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bTIgpd/btrSsRjMP7p/y0142A5gnG0DNrIdD7eNKk/img.png)
Spring framework를 통해서 개발자들의 겨울은 끝났다............? Spring이 봄(?)이라면 SpringBoot는 여름(?)이다. (봄보다 여름이 좋다는 가정) 이전에 봄이 찾아오던 과정 => Spring 이전 Servlet과 비교하는 글 https://sh970901.tistory.com/111 스프링부트는 스프링 기반 애플리케이션을 단독적이고 상용화 수준으로 만들 수 있고 그냥 실행시키면 된다. 아주 간단하다는 걸 표현하는 것 같다. 스프링은 모든 dependency를 버전 정보까지 정확하게 작성하여야 원하는 기능을 사용할 수 있는데 스프링 부트는 버전 관리를 권장 버전으로 자동 설정된다. implementation 'org.springframework.boot:spring-b..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bimMBO/btrSwsCVfBR/BIWVaBmVAk5kawGuwtCMtk/img.png)
처음 웹 서버는 정적인 요청에 대한 응답만 가능했다. 동적인 페이지를 만들기 위해 프로그램을 붙였고 대표적인 것이 서블릿이다. 초기에는 CGI 구현체를 활용했지만 요청마다 새로운 프로세스를 만드는 것은 너무 비효율적이였다. 그래서 하나의 싱글톤 CGI 구현체를 사용함으로써 스레드로 처리할 수 있게 되었고 이것이 현재의 서블릿이 된 것이다. Spring Web MVC는 서블릿을 사용한다. 그럼 이 둘을 비교하는게 맞을까도 싶다. 그래서 서블릿과 서블릿을 사용한 Spring Web MVC에 대해 기록해보려고 한다. 그림과 같은 http 요청과 응답을 개발자가 직접 처리하기 위해 응답을 만들고 하는 과정을 거친다면 힘들 것이다. 모든 규약을 확인해가며 긴 텍스트로 들어온 요청을 분석하고 거기에 맞는 처리를 하..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/nu4tC/btrQZgLPJxP/M8VQgH8IvpgwSyLW3rYXOk/img.png)
https://sh970901.tistory.com/108 를 참고하여 REST API를 개발하기 위한 RsData를 생성하였다. Member 컨트롤러를 생성하여 로그인 요청에 대한 처리를 작성해보자. @PostMapping("/login") public ResponseEntity login(@Valid @RequestBody LoginDto loginDto) { Member member = memberService.findByUsername(loginDto.getUsername()).orElse(null); if (member == null) { return Util.spring.responseEntityOf(RsData.of("F-2", "일치하는 회원이 존재하지 않습니다.")); } if (pass..
ResponseEntity를 작성할 때 header, body, status code를 분리하여 REST API를 구현하였는데 잘못된 요청 시도에서 body에 잘못된 요청이라는 정보를 편리하게 싣고 상태 코드도 커스텀하여 body에 추가하려한다. 따라서 필자는 Result Data 줄여서 RsData라는 클래스를 만들어서 활용하였다. @Getter @Setter @AllArgsConstructor public class RsData { private String resultCode; private String msg; private T data; public static RsData of(String resultCode, String msg, T data) { return new RsData(result..
1. SecurityConfig를 작성하자. JwtAuthorizationFilter 라는 필터를 생성하여 스프링 시큐리티 내부에 여러 인증 필터 중 만만한 UsernamePasswordAuthenticationFilter 앞에 추가하였다. @Bean public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .exceptionHandling(exceptionHandling -> exceptionHandling .authenticationEntryPoint(authenticationEntryPoint) ) .httpBasic().disable() .csrf().disabl..