분류 전체보기99 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. WITH RECURSIVE 쿼리 WITH RECURSIVE 쿼리? 메모리 상에 가상의 테이블을 저장 재귀 쿼리를 이용하여 실제로 테이블을 생성하거나 INSERT를 하지 않아도 가상의 테이블을 생성할 수 있습니다. 보통 계층형의 트리 구조로 표현하기 위해서 사용을 합니다. 문법 WITH RECURSICE 임시테이블명 AS( SELECT 초기값 AS 컬럼명 FROM 테이블명 WHERE 제어문 UNION ALL SELECT 반복문 AS 컬럼명 FROM 테이블명 WHERE 반복 종료 조건 ) SELECT 컬럼명 FROM 임시테이블명 문법은 위처럼 작성하면 됩니다. 위의 문법으로만 작성 가능한 것은 아니고 변형도 가능합니다. 예시 WITH RECURSIVE temp_table AS( select 1 AS test UNION all select .. DB/SQL 2022. 12. 17. Introduce Introduction 안녕하세요! 백엔드 개발자를 목표를 하고 있는 한대경입니다. 처음에는 아무것도 모른 채로 수업을 듣고 구현을 해보는 것이 어려웠지만 익숙해지고 호기심과 배움으로 다가가니 개발이라는 것에 흥미와 재미를 느끼고 있습니다. 꾸준함이 중요하고 그것이 저를 한층 더 성장시킨다는 것을 알기에 계속해서 구현하고 싶은 것을 생각해보고 적용을 해보고 찾아보는 습관을 들이고 있습니다. Contact Github: https://github.com/dhmk47 Email: dhmk47@naver.com Skills Backend Java Spring Boot, Spring MVC Mybatis Maven Git, Sourcetree Server & DBMS AWS EC2, S3, RDS MariaDB.. Introduce 2022. 11. 28. [위니아에이드] 팀 프로젝트 - AWS 배포 후 파일 업로드, 삭제 Heroku 배포 후 이미지 업로드로 상당히 애를 먹었고 사용 방법은 AWS S3를 이용해서 하려고 했습니다. 하지만 GitHub를 통해서 배포를 하는데에 있어서 IAM AccessKey가 GitHub에 노출이 되면 AccessKey를 변경하라는 이메일이 오고 권한을 막아버리는 정책을 추가합니다. 그래서 Heroku 배포를 포기하고 AWS EC2를 이용해서 배포를 했습니다. 생각보다 어렵진 않았습니다. AWS로 배포를 하면 기존에 사용하던 방법으로 파일을 로컬에 저장, 삭제를 하면 되기 때문에 오히려 더 쉬운 것 같습니다. @Slf4j @Service @RequiredArgsConstructor public class FileServiceImpl implements FileService { @Value(.. 카테고리 없음 2022. 11. 22. [위니아에이드] 팀 프로젝트 - AWS S3 이미지 업로드 지금까지는 이미지를 upload 폴더를 만들어서 해당 폴더에 이미지, 파일을 저장 및 관리를 하였습니다. 하지만 Heroku를 통해 배포를 하려면 static 폴더와 target 폴더에 이미지, 파일을 저장해야 합니다. 그 이유는 컴파일 시 -> src 폴더의 파일이 target폴더로 복사 html, js 등 파일은 target폴더의 static 폴더 참조 그래서 src에 파일 없고 target에만 파일 존재하면 컴파일 시 src의 빈 폴더를 복사하기 때문에 src에 업로드해야 합니다. 반대로 src에만 파일이 있다면 컴파일 하지 않으면 복사를 하지 않기 때문에 target의 static 안의 이미지를 참조할 수 없습니다. 그래서 두개의 폴더에 전부 이미지를 업로드, 로드를 성공시키고 배포를 해보니 다시.. Spring boot/위니아에이드 클론코딩 프로젝트 2022. 11. 17. [위니아에이드] 팀 프로젝트 - 이미지 삽입과 업로드 지난번에 관리자의 기능 중 Solution 게시글을 작성하는 로직을 작성했습니다. 처음에는 작성과 DB INSERT까지 에러가 없었으며 임시 폴더도 정상적으로 삭제가 되어서 문제가 없다고 생각했습니다. 하지만 작성된 게시글을 수정을 위해 DB에서 데이터를 불러와서 이미지 경로를 요청하는 과정에서 문제가 생겼습니다. 이미지를 삽입하면 요청을 보내고 업로드 했던 경로를 응답해주는 Ajax가 있습니다. 자세한 코드는 아래의 글을 참고하시면 됩니다. https://dhmk47.tistory.com/79 [위니아에이드] 팀 프로젝트 - 관리자 Solution 게시글 작성 클론 웹 사이트에서 자주 하는 질문과 자가진단과 같은 해결책을 알려주는 게시판이 있습니다. 이번에는 이 데이터를 관리자 페이지에서 작성을 구현하.. Spring boot/위니아에이드 클론코딩 프로젝트 2022. 11. 11. [위니아에이드] 팀 프로젝트 - 관리자 Solution 게시글 작성 클론 웹 사이트에서 자주 하는 질문과 자가진단과 같은 해결책을 알려주는 게시판이 있습니다. 이번에는 이 데이터를 관리자 페이지에서 작성을 구현하고 구현함에 있어서 고민을 했던 부분과 해결하고 완성한 로직을 리뷰하고자 합니다. 목표 이러한 게시글을 작성하여야 합니다. 구현 위와 같이 간단하게 뷰를 만들고 기능을 구현하려 합니다. (썸머노트 에디터를 사용했습니다.) function setSummerNote() { $(document).ready(function() { $('#summernote').summernote({ height: 600, minHeight: null, maxHeight: null, focus: true, lang: "ko-KR", callbacks: { onImageUpload: (fi.. 카테고리 없음 2022. 11. 6. 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. 이전 1 2 3 4 5 ··· 9 다음