안녕하세요. 오늘은 인텔리제이를 사용하시는 분들을 위해서 좋은 플러그인을 하나 발견해서 공유하고자 합니다. SonarLint 스프링 프레임워크를 사용하며 자연스럽게 Java를 이용해서 프로그래밍을 자주 하게 되는데요. 자바의 Exception 중에서 개발자들이 NullpointerException을 가장 많이 낸다고 합니다. 그 이유중 하나가 저도 많이 느끼지만 Nullable에 대한 처리를 제대로 하지 못했던 경우입니다. 그로인해 예기치못한 상황에서 API가 서버에러를 내고 클라이언트 개발자들에게 Exception을 전달받는 상황이 많았습니다. 그래서 IDE 컴파일러 단에서 이걸 좀 확인해줄 수 있는 강력한 Lint가 없을까 생각하면서 찾아보다가 SonarLint를 알게 되었습니다. 사용법 일단 플러그..
안녕하세요. 오늘은 커스텀 어노테이션을 생성할 때 주로 사용하는 어노테이션인 @Retention어노테이션에 대해서 다루어보겠습니다. 보통 어노테이션은 다음과 같이 선언됩니다. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { } @Retention 어노테이션으로 어느 시점까지 어노테이션의 메모리를 가져갈 지 설정하고, @Target 어노테이션으로 필드, 메소드, 클래스, 파라미터 등 선언할 수 있는 타입을 설정하면 대부분 커스텀 어노테이션은 쉽게 생성할 수 있습니다. 여기서 속성부분만 설정해주면요!! 그럼이제 @Retention 어노테이션을 까보겠습니다!!! /** * Indicat..
@ConfigurationProperties @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ConfigurationProperties { @AliasFor("prefix") String value() default ""; @AliasFor("value") String prefix() default ""; boolean ignoreInvalidFields() default false; boolean ignoreUnknownFields() default true; } 기본적으로 소스는 다음과 같습니다. 안의 주석문을 뜯어보면 다음과 같습니다. 맨 위엣줄..
안녕하세요. 오늘은 서버사이드 렌더링 환경에서 사용되는 템플릿 엔진중 thymeleaf라는 템플릿 엔진을 예제로 스프링부트로 서버사이드 렌더링했을 때 서버를 직접 재시작하지 않고도 화면을 갱신하는 방법을 공유하고자 합니다. 먼저 필요한 컨트롤러를 작성합니다. 컨트롤러 @Controller public class HelloController { @GetMapping("/hello") public String hello(Model model) { model.addAttribute("data", "hello"); return "hello"; } } locahost:8080 를 기본으로 /hello로 접근했을 때, templates/hello.html 파일을 찾아내서 렌더링하게 될 것입니다. hello.html..
이번 포스팅에는 JUnit 테스트할 때 특정 시간동안 테스트가 끝나지 않으면 테스트를 실패시키는 메소드인 assertTimeout과 assertTimeoutPreemptively 메소드 두개를 알아보겠습니다. assertTimeout(Duration timeout, Executable executable) - timeout과 실행 인터페이스인 Executable 타입의 인자를 받는다. executable.execute() 메소드로 실행한 다음에 timeout과 실제 실행시간을 비교하여 테스트가 실패했는지 성공했는지 여부를 판단한다. JUnit 소스 까보기 단점 : 만약에 테스트 자체가 굉장히 오래걸리는 부분을 test 해야한다면 제한시간이 있는데도 모든 테스트가 끝날때 까지 기다려야하는 단점이 존재한다...
Http 프로토콜에는 여러가지 상태값이 존재합니다. 200은 대표적으로 성공적으로 http 통신에 성공했다는 의미이며, 404는 해당 주소를 찾지 못하여 http 통신을 할 수 없다는 의미이고, 500은 서버에서 에러가 발생하여 http 통신은 하였으나 원하는 결과를 얻지 못하였음을 의미할 것입니다. 그 중에서 401(Unauthorized)와 403(Forbidden)의 차이에 대해서는 모호한 점이 있어서 정리하는 겸 공유하고자 합니다. 스프링을 프로젝트를 생성해서 개발을 하다보면 스프링 시큐리티 프로젝트를 통해 인증과 허가에 대한 개념을 배울 것입니다. 로그인을 한 유저가 api를 호출했을 때, 인증 토큰 혹은 세션을 조회하여 허가받은 유저라면 원하는 결과를 얻어서 http 통신에 성공할 것입니다. ..
안녕하세요. 오늘은 Arrays.asList() 라는 메소드를 사용하다가 발생한 에러에 대해서 공유하고자 합니다. 먼저 List list = Arrays.asList("A", "B", "C"); 다음과 같이 Arrays.asList로 만든 list 객체가 있었고 추가적으로 "D"라는 문자열이 추가될 수 있는 상황이었습니다. 그리하여 list.add("D"); "D" 문자열을 추가해주었더니 다음과 같은 에러가 발생하였습니다. Request processing failed; nested exception is java.lang.UnsupportedOperationException 왜 발생하는지 알아보기 위해서 Arrays의 asList 메소드를 까봤습니다. 메소드 바로 위에 달린 주석을 참조하니 단번에 눈치..
안녕하세요. 오늘은 예외처리한 부분을 테스트하기 위한 JUnit 단위테스트 방법을 포스팅하고자 합니다. 보통 대부분의 회사나 프로젝트에서 특정한 목적으로 제작한 커스텀 Exception 객체들이 있을 것입니다. 그러한 경우, 다른 Exception 처리보다 많은 테스트가 필요하게 될텐데요. 그 방법중 하나를 공유해보고자 합니다. 먼저 CustomException 객체를 만듭니다. 매우 간단히 만들었습니다. public class CustomException extends Exception{ public CustomException(String message) { super(message); } } - Exception 객체를 생성하기 위한 생성자만 구현해놓은 정도입니다. 추후 필요한 생성자들을 오버로딩하..