목록Spring (72)
똑같은 삽질은 2번 하지 말자
SOP과 CORS Single-Origin Policy (같은 오리진에만 요청을 보낼 수 있다.) Cross-Origin Resource Sharing(서로 다른 오리진끼리도 보낼 수 있게한다.) 예전에 이 오류가 생겨서 JSONP로? 보낸적이 있다. SpringBoot에서 설정하는 방법은 간단하게 @CrossOrigin으로 가능하다. @RestController public class SampleController { @CrossOrigin(origins ="http:localhost:1212") // 1212포트 cors @GetMapping("hello") public String hello() { return "hello"; } } 이렇게 해당 맵핑에만 설정할 수도 있고 Controller로 자체..
스프링 @MVC 예외 처리 방법 @ControllerAdvice @ExceptionHandler 스프링 부트가 제공하는 기본 예외 처리기 BasicErrorController HTML과 JSON 응답 지원 커스터마이징 방법 ErrorController 구현 HTML 기본 예외 처리는 요거 많이들 봤을거라고 생각되는데 그럼 이제부터 ErrorHandler를 커스텀해보자 @GetMapping("/error") public String error() { throw new SampleException(); } @ExceptionHandler(SampleException.class) public @ResponseBody AppError sampleError(SampleException e) { AppError a..
스프링 부트가 자동 설정을 지원하는 템플릿 엔진 (FreeMarker Groovy Thymeleaf Mustache) JSP를 권장하지 않는 이유 JAR 패키징 할 때는 동작하지 않고, WAR 패키징 해야 함. Servlet Container의 개입이 있어야만 페이지가 완성된다. 그에 반해 , Thymeleaf는 독자적으로 페이지를 완성가능 그래서 andDO(print()) 테스트도 찍히는거(밑의 코드를 참조) SampleController 를 만들고 hello 맵핑하고 Model에 name을 담아서 반환하는 테스트를 ㄱㄱ @RunWith(SpringRunner.class) @WebMvcTest(SampleController.class) public class SampleControllerTest { @..
Web JAR Client에서 사용하는 BootStrap Vue React 등등 Web JAR로 Dependency에 추가할 수 있다. 원하는 것을 Maven 중앙 저장소에서 찾아서 넣으면 된다 org.webjars.bower jquery 3.5.0 제이쿼리를 추가하고 코드를 돌리면 잘 동작하는걸 알 수 있다. 버전 생략하고 사용하려면 webjars-locator-core 의존성 추가 WelCome Page index.html 찾아 보고 있으면 제공.(Controller 설정없이도 자동 설정된다는 말) index.템플릿 찾아 보고 있으면 제공.(index로 시작하는 친구 찾아본다는말 찾으면 그 친구로 자동설정) 둘 다 없으면 에러 페이지. -> White 뭐시기(많이 본 화면 ㅋ) 파비콘 favicon...
@Valid Dispatcherservlet이 메소드안에 선언된 객체를 만들어주고 값을 넣어준다. @Valid선언된객체에 설정을 바탕으로 검사후 BindingResult에 담아준다. 에러를 발생하려면 FieldError객체를 만들어서 BindingResult에 넣어준다. 태그에서 object에 담긴 객체의 프로퍼티를 filed *{필드이름} 형식으로 사용한다 errors는 BindingResult에 있는 에러값을 출력해준다. BindingResult.hasErrors : 에러가 있는지 검사한다. thymeleaf를 사용하여 사용한 예제이다. @Controller public class MemberController { @Autowired private MemberService memberService; ..
정적 리소스 지원 정적 리소스 맵핑 “ /**” 기본 리소스 위치 classpath:/static classpath:/public classpath:/resources/ classpath:/META-INF/resources 예) “/hello.html” => /static/hello.html spring.mvc.static-path-pattern: 맵핑 설정 변경 가능 spring.mvc.static-locations: 리소스 찾을 위치 변경 가능 Last-Modified 헤더를 보고 304 응답을 보냄. -> Last-Modified 이후에 갱신된게 없으므로 304 응답으로 훨씬 빠름 ResourceHttpRequestHandler가 처리함. WebMvcConfigurer의 addRersourceHan..
Spring-Boot-Devtools 캐시 설정을 개발 환경에 맞게 변경.(캐시를 끔 보통) 클래스패스에 있는 파일이 변경 될 때마다 자동으로 재시작. 직접 껐다 켜는거 (cold starts)보다 빠르다. 왜? 릴로딩 보다는 느리다. (JRebel 같은건 아님) 리스타트 하고 싶지 않은 리소스는? spring.devtools.restart.exclude 리스타트 기능 끄려면? spring.devtools.restart.enabled = false 라이브 릴로드? 리스타트 했을 때 브라우저 자동 리프레시 하는 기능 브라우저 플러그인 설치해야 함. 라이브 릴로드 서버 끄려면? spring.devtools.liveload.enabled = false 글로벌 설정 ~/.spring-boot-devtools.p..
음 테스트 코드를 짜던 도중 새로운 코드작성법? 을 하나 익혔는데 지금 SampleServices 라는 클래스가 없는 상황에서 하나하나 새로운 클래스 작성할 때 처럼 패키지 클릭하고 class 만드는 이름치고 만드는 작업을 그냥 F2하나로 줄여버릴수 있다.(저기 빨간줄에 커서대고 F2 누르면 아마 느끼실껍니다. 편안함을) 물론 저기 속하는 getName함수도 똑같이 적용 가능! import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import stat..
Gradle dependencies { implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' } Maven com.github.gavlyukovskiy p6spy-spring-boot-starter 1.5.6
@Profile(프로파일) @Profile 애노테이션은 어디에? 어떤 특정한 Bean 설정을 하고 싶을때, application.properties에 어떤 프로파일을 활성화 할 것인가? 를 정할 수 있는데 spring.profiles.active = prod prod 라는 프로파일을 활성화 시킨다. 다음은 자바 코드로 활성화한 프로파일로 스프링 시큐리티 환경설정 @Configuration @EnableWebSecurity @Profile("Prod") @RequiredArgsConstructor public static class LessPermissiveSecurityConfiguration extends WebSecurityConfigurerAdapter { private final JwtTokenP..