Spring boot/기본 정리16 Unit Test - Repository https://dhmk47.tistory.com/88 Unit Test - Controller Web Layer 중 컨트롤러 영역에 대한 Unit Test를 해보겠습니다. Given-When-Then 패턴으로 사용합니다. Given 테스트에서 구체화하고자 하는 행동을 시작하기 전에 테스트 상태를 설명하는 부분 When 구체화 dhmk47.tistory.com https://dhmk47.tistory.com/89 Unit Test - Service 저번글에 이어서 이번에는 Service 계층의 단위 테스트를 진행하겠습니다. 진행 과정 @RequiredArgsConstructor @Service public class ProductService { private final ProductRepository p.. Spring boot/기본 정리 2022. 12. 21. Unit Test - Service https://dhmk47.tistory.com/88 Unit Test - Controller Web Layer 중 컨트롤러 영역에 대한 Unit Test를 해보겠습니다. Given-When-Then 패턴으로 사용합니다. Given 테스트에서 구체화하고자 하는 행동을 시작하기 전에 테스트 상태를 설명하는 부분 When 구체화 dhmk47.tistory.com https://dhmk47.tistory.com/90 Unit Test - Repository https://dhmk47.tistory.com/88 Unit Test - Controller Web Layer 중 컨트롤러 영역에 대한 Unit Test를 해보겠습니다. Given-When-Then 패턴으로 사용합니다. Given 테스트에서 구체화하고자 .. Spring boot/기본 정리 2022. 12. 21. Unit Test - Controller Web Layer 중 컨트롤러 영역에 대한 Unit Test를 해보겠습니다. Given-When-Then 패턴으로 사용합니다. Given 테스트에서 구체화하고자 하는 행동을 시작하기 전에 테스트 상태를 설명하는 부분 When 구체화하고자 하는 그 행동 Then 어떤 특정한 행동 때문에 발생할 거라고 예상되는 변화에 대한 설명 https://dhmk47.tistory.com/89 Unit Test - Service 저번글에 이어서 이번에는 Service 계층의 단위 테스트를 진행하겠습니다. 진행 과정 @RequiredArgsConstructor @Service public class ProductService { private final ProductRepository productRepository; p.. Spring boot/기본 정리 2022. 12. 20. @MockMvc, @SpringBootTest, @WebMvcTest @MockMvc 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현할 수 있는 클래스 @ExtendWith(MockitoExtension.class) class ProductRestControllerTest { @InjectMocks private ProductRestController productRestController; @Mock private ProductService productService; private MockMvc mockMvc; @BeforeEach public void init() { mockMvc = MockMvcBuilders.standaloneSetup(productRestController) // 추가적으로 커스텀도 가능합니다. .setCont.. Spring boot/기본 정리 2022. 12. 20. Mokito @Mock , @MockBean , @Spy , @SpyBean Test Double - Mokito 스프링과 Junit을 이용해서 테스트 코드를 작성하다 보면 테스트 환경(database, api)을 구현하는 코드까지 작성해야 하고 실제 테스트할 코드보다 환경을 구현하는 코드가 훨씬 더 복잡해지게 됩니다. 이런 문제 영역을 해결하기 위해서 Test Double이라는 것이 나왔고 Java에서는 대표적으로 Mockito가 있습니다. Mokito 어노테이션에는 @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks가 존재합니다. Test Double을 사용하는 이유 @RequiredArgsConstructor @Service public class ProductService { private final ProductRepository prod.. Spring boot/기본 정리 2022. 12. 19. TDD(Test Driven Development) TDD Test Driven Development의 약자로 테스트가 주도하는 개발이라는 의미로 해석합니다. 1. 항상 실패하는 테스트를 먼저 작성하고 (RED) 2. 테스트를 통과하는 프로덕트 코드를 작성하고 (Green) 3. 테스트가 통과하면 프로덕트 코드를 리팩토링합니다. (Refactor) 상세 설명 더보기 1. Ask(질문): 테스트 작성으르 통해 시스템에 질문 (결과는 실패로 응답하게 합니다.) 2. Respond(응답): 테스트를 통과하는 코드를 작성해서 질문에 대답 (성공으로 응답하게 합니다.) 3. Refine(정제): 아이디어를 통합하고 불필요한 것은 제거하고, 모호한 것은 명확히 해서 대답을 정제 (리팩토링) 4. Repeat(반복): 다음 질문을 통해 대화를 계속 진행 TDD 방법으.. Spring boot/기본 정리 2022. 12. 18. JWT를 이용한 인증, 권한 관리 JWT를 이용하는 로직을 연습하고 싶어서 강사님께 많이 여쭈어보고 인터넷에도 검색하며 공부를 하였는데.. 사용하시는 분마다 구현 로직이 달라서 어떤 틀을 가지고 구현을 해야 할지 갈피를 못 잡고 있었습니다. 우선은 JWT를 이용해서 인증과 권한 체크를 자유롭게 이용해서 원하는 데이터를 받을 수 있게끔 구현해보라고 강사님께서 조언을 해주셨습니다. 그래서 많은 시도를 해보다가 구현을 했습니다. 하지만 이게 올바른 방법이다 라고 말할 수 없는 부분이고 많은 허점이 있지만 그래도 JWT의 인증 방식을 이해하고 나름대로 내 입맛에 맞게끔 구현한 것에 만족하며 더욱 공부가 필요한 부분이라고 생각이 듭니다. JWT? Cookie 와 Session은 서버 저장소에 Key Value의 형태로 저장됩니다. 그렇기 때문에 .. Spring boot/기본 정리 2022. 11. 2. AOP에서 HttpServletRequest 사용하기 AOP는 메서드에 관하여 메서드 호출 전, 후에 어떠한 로직을 하고 싶을 때 사용을 합니다. @Before(value = "enableValidCheck()") public void validCheck(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); for(Object arg : args) { if(arg.getClass() == BeanPropertyBindingResult.class) { BindingResult bindingResult = (BindingResult) arg; Map errorMap = new HashMap(); if(bindingResult.hasErrors()) { bindingResult.getFieldErrors() .. Spring boot/기본 정리 2022. 11. 1. REST API REST는 다음과 같은 구성으로 이루어져 있습니다. 자원(Resource) -> URI 행위 -> HTTP Method 표현 -> 어떻게 표현할지 URI와 URL의 차이 URL -> 전체 주소 https://naver.com/index/test URI -> 도메인을 포함하지 않고 뒤의 요청 메시지 index/test -> 자원이라고 표현 HTTP Method 중에서 자주 사용되는 것들 POST -> Create를 의미합니다. GET -> Select를 의미합니다. PUT -> Update를 의미합니다. DELETE -> Delete를 의미합니다. REST의 특징 Uniform (유니폼 인터페이스) Uniform Interface는 URI로 지정한 Resource에 대한 조작을 명시하고 HTTP Metho.. Spring boot/기본 정리 2022. 10. 31. Error Code 100번대 -> 요청을 받았으며 작업을 계속한다(잘 사용하지 않습니다.) 200번대 -> 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킵니다. 300번대 -> 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 합니다. 400번대 -> 클라이언트에 오류가 있음을 나타냅니다. (클라이언트의 요청이 잘 못 되었을 때) 500번대 -> 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타냅니다. (요청은 정상이지만 서버에서 문제가 생겼을 때 -> 오타, DB 연결 문제 등등..) 400: 매개변수 타입 오류 403: 매핑주소로 들어갈 권한이 없을 때 404: 경로 문제 405: 매핑주소 문제 400번대의 오류를 몇 가지 살펴보면 위와 같습니다. Spring boot/기본 정리 2022. 10. 31. @Qualifier를 이용한 DI DI를 할 때 IoC 컨테이너에 하나의 타입만 있다면 해당 객체를 주입받지만 같은 타입이 있다면 문제가 발생합니다. 예를 들자면 같은 Interface를 구현한 클래스가 2개가 있다고 가정한다면 그 Interface 타입으로 주입받으려고 한다면 2개의 구현 체중 어느 것을 DI 해야 할지 모르게 됩니다. public interface Shape { public void print(); } @Component public class Circle implements Shape{ @Override public void print() { System.out.println("원형입니다."); } } @Component public class Triangle implements Shape{ @Override pub.. Spring boot/기본 정리 2022. 10. 31. DI 그리고 IoC DI(Dependency Injection) : 의존성 주입 외부에서 생성된 객체를 주입해주는 것입니다. IoC(Inversion of Control) : 제어의 역전 말 그대로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미합니다. DI는 의존관계를 외부에서 주입하는 것을 의미합니다. class A { private Shape shape; public A(Shape shape) { this.shape = shape; } } class B { public void createShape() { A circle = new A(new Circle()); A triangle = new A(new Triangle()); A square = new A(new Square().. Spring boot/기본 정리 2022. 10. 31. 이전 1 2 다음