1. 최종 프로젝트
댓글 컨트롤러 테스트 코드 작성 실습 : RestDocs 적용하지 않은 버젼, RestDocs는 나중으로..
컨트롤러 테스트 코드에서 시큐리티 필터 체인을 통과한 사용자를 설정하기위해 필요한 코드
-> with(csrf())
package com.example.townmarket.common.domain.comment.controller;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.example.townmarket.annotation.WithCustomMockUser;
import com.example.townmarket.common.domain.comment.dto.CommentRequestDto;
import com.example.townmarket.common.domain.comment.service.CommentService;
import com.example.townmarket.common.util.SetHttpHeaders;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
@ExtendWith({SpringExtension.class})
@WebMvcTest(controllers = CommentController.class)
@MockBean(JpaMetamodelMappingContext.class)
class CommentControllerTest {
@MockBean
CommentService commentService;
@Autowired
MockMvc mockMvc;
@Autowired
ObjectMapper objectMapper;
@Test
@WithCustomMockUser
void createComment() throws Exception {
// given
Long boardsId = 1L;
CommentRequestDto commentRequestDto = new CommentRequestDto("commentRequestDto");
// when
ResultActions resultActions = mockMvc.perform(post("/comments/board/{boardsId}", boardsId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(commentRequestDto))
.with(csrf()));
// then
resultActions.andExpect(status().isCreated());
}
}
아직 궁금한 점 : MockMvc 초기화는 어떻게?
AWS : S3 공부하기
+ 생활코딩 : S3 특징
- 많은 사용자가 접속을 해도 이를 감당하기 위해 시스템적인 작업을 하지 않아도 된다
- 저장할 수 있는 파일의 제한이 없다
- 최소 1바이트에서 최대 5TB의 데이터를 저장하고 서비스할 수 있다
- 파일에 인증을 분여 무단으로 엑세스하지 못하도록 할 수 있다
- Http와 BitTorrent 프로토콜을 지원한다
+ AWS의 선두주자는 넷플릭스, 그리고 며칠 전 들었던 MSA에 대해
https://www.samsungsds.com/kr/insights/msa_and_netflix.html
SpringBoot : AWS S3와 프로그래밍 방식 엑세스를 통해 파일 업로드하는 방법 공부
-> 개인 과제에 실습해보기 : build.gradle에 의존성 주입, yml, Config 파일 생성
2. JPA심화 강의
JPQL 및 QueryDSL 활용
코드에 문자열이 들어가는게 왜 안좋은건가요?
- 문자열은 오타가 발생할 여지가 많다.
- 개발할 때 같은 공통적인 문자열이 있을때 한군데에서 수정이 일어나면 모두 수정해야한다.
- 잘못된 코드가 있더라도 문자열 자체를 컴파일러가 검사 하지는 않기 때문에 컴파일 시점에 잡지 못한다.
- 이로인해 런타임 시점에 버그가 발생한다.
- 런타임 시점에 발생한 버그는 서비스 정합성에 영향을 주며 원인을 찾기도 어렵다.
해결방법
- 문자열을 포함하여 구현된 기능들은 객체화 또는 함수화 해서 컴파일시 체크되도록 한다.
- 문자열로 선언된 변수들은 상수로 선언하여 공통적으로 관리한다. (상수 클래스 선언 추천 👍)
QueryDSL로 개발하기
+@Embeddable, @Embedded : @Embeddable 클래스의 필드를 @Embedded 필드가 속한 엔티티가 그 값을 가진다
+@MappedSuperclass : 모든 테이블에 이 엔티티의 필드 값의 매핑정보가 상속되어야 할 경우
'내일배움캠프 4기 스프링 > 내배캠 TIL📘' 카테고리의 다른 글
02. 17 TIL (0) | 2023.02.17 |
---|---|
02. 16 TIL (0) | 2023.02.17 |
02. 14 TIL (0) | 2023.02.14 |
02. 13 TIL (0) | 2023.02.14 |
02. 10 TIL (0) | 2023.02.10 |