본문 바로가기

전체 글

Kotlin에서 Rest Docs 문서화 코드 개선하기 기존에는 테스트 결과를 문서화 하기 위해, Rest Docs에서 제공하는 FieldDescriptor를 다음과 같이 생성하였다. 그러다 보니 Field가 많으면 엄청난 양의 코드를 작성해야 하고 이 부분의 가독성이 떨어져 개선하고자 한다. ❌ 문제의 코드 restDocMockMvc.post("/test") { jsonContent(request) }.andExpect { status { isOk() } }.andDo { handle( MockMvcRestDocumentation.document( "{class-name}/test-success", requestFields( fieldWithPath("name").description("이름").attributes(field(EXAMPLE, request... 더보기
https 적용 및 nginx 설정하기 프로젝트 진행 중, 프론트 서버는 vercel을 이용해서 배포를 진행하여 https로 배포가 되어 있다. 이때, 백 서버는 http로 배포가 되어 있어, mixed content 문제가 발생했다. 이러한 이유로 백엔드 단에 https를 적용해야 하는 상황에 직면했다. ✔ https 적용 방법 1. 가비아 + ACM + AWS Route 53 + AWS Load Balancer을 활용한다. 2. 가비아 + Nginx + Certbot/SSL 을 활용한다. 💥 도메인이 필요한 이유는 SSL(TLS) 인증서를 발급 받을 때, 도메인이 아니라 IP일 경우 인증서 발급이 제한되기 때문이다. 가비아 + ACM + AWS Route 53 + AWS Load Balancer ✔ 사전 지식 💬 AWS Route 53 ◼.. 더보기
Kotest를 통한 DCI 패턴 적용 프로젝트를 진행하면서 Controller 테스트를 작성하였고, 해당 코드에 대해 리뷰어로부터 다음과 같은 리뷰를 받게 되었다. 기존 테스트 코드는 다음과 같은 형태로 작성하였다. @WebMvcTest(TestController::class) class TestControllerTest : ControllerTestHelper() { @Test fun `테스트 API - 성공`() { --- } @Test fun `테스트 API - 실패 (name is empty)`() { --- } } 왜 리뷰어께서 위와 같은 리뷰를 남기셨는지 의문이 들었고, 의문을 바탕으로 알아본 DCI 패턴에 대해 작성하고자 한다. DCI 패턴이란? DCI 패턴은 BDD 테스트 코드 작성 패턴으로, BDD 패턴은 코드의 행동을 설명.. 더보기
Kotest + 생성자 Bean 주입 상황 @WebMvcTest(TestController::class) class TestControllerTest @Autowired constructor( private val testService: TestService ) : DescribeSpec({ describe("---") { context("---") { it("---") { --- } } } }) Kotest DCI 패턴을 적용하여 테스트를 진행하려고 테스트 코드를 작성하는 과정에서 생성자를 통해 빈을 주입 받으니 다음과 같은 에러가 발생했다. io.kotest.engine.spec.SpecInstantiationException: Could not create instance of class kr.weit.odya.controller.te.. 더보기
spring에서 flyway 사용하기 ◼ flyway는 데이터 베이스의 현상관리를 목적으로 하는 툴이다. ◼ 데이터 베이스의 DDL 이력을 쌓아서 DDL이 어떻게 변화되었는지 관리하고, 사용하는 데이터 베이스의 스키마 버전을 관리할 수 있다. 💬 스키마의 이력관리와 프로덕션 코드 작성 시, SQL 문도 함께 작성하여 배포 시 자동으로 DB 스키마 수정이 가능하도록 하기 위해 사용한다. 사용하기 ✔ build.gradle.kts 파일에 다음과 같은 의존성을 추가한다. implementation("org.flywaydb:flyway-core") implementation("org.flywaydb:flyway-mysql") 💥 MariaDB 10.6 이상 버전을 사용하는데 implementation("org.flywaydb:flyway-mysql.. 더보기
Kotlin + Spring DTO에서 NotNull 변수의 null Validation 📒 상황 data class FacilityReq( @NotNull val category: Category, @NotBlank val name: String ) ◼ 시설 등록 요청 DTO를 위와 같이 작성하고 name 값을 넣지 않고 요청을 보내면 에러가 발생한다. 💥 기대했던 에러는 name은 null이 될 수 없다는 에러였는데, 에러 API 응답으로 설정한 값과 다른 값이 응답으로 왔다. 📒 원인 name을 NotNull 타입인 String으로 설정해서 null을 허용하지 않는 타입으로 정의했다. 이로 인해, name이 null로 채워지게 된다면 @field:NotBlank validation 로직을 타기 전에 변수에 값을 할당하는 과정에서 예외가 발생하게 되어 다음과 같은 에러가 발생한다. 💥 H.. 더보기
Next.js 사용하기 React는 라이브러리이며, 서버로부터 데이터를 받아와 브라우저에서 실시간으로 HTML을 만드는 Client Side Rendering 방식이다. 이러한 방식은 구글 검색 노출에 오랜 시간이 소요되고, 첫 페이지 로딩 속도가 느리다는 단점이 있다. 반면에, Next.js는 풀스택 프레임워크이며, 프론트엔드(React 문법)랑 백엔드를 모두 개발할 수 있다. 또한, Server Side Rendering 방식으로 모든 정보가 담긴 HTML을 서버가 만들어서 전송해 준다. 💬 React는 라이브러리로 우리가 모든 것을 직접 생성하고 설정해주어야 했지만, Next에서는 이미 만들어져 있어 Next 규칙에 따라 코드만 작성하면 된다. 💬 Next.js는 React 문법을 사용해서 웹 페이지를 제작한다. 장점 ◼.. 더보기
CSR과 SSR, SSG ◼ 브라우저가 서버로부터 요청해 받은 내용을 브라우저 화면(view)에 표시해주는 작업을 브라우저 렌더링이라고 한다. ◼ 즉, 브라우저가 서버로부터 HTML, CSS, JavaScript 문서를 전달받아 브라우저 엔진이 각 문서를 해석해 화면에 그려주는 것이다. ◼ 그리고 이러한 브라우저 렌더링은 크게 CSR(Client Side Rendering), SSR(Server Side Rendering), SSG(Static Site Generation)으로 나뉘어 이에 대해 알아보고자 한다. CSR(Client Side Rendering) CSR은 클라이언트(브라우저)에서 렌더링이 이루어지는 방식을 말한다. 즉, 클라이언트는 서버로부터 HTML, CSS, JavaScript를 받아와서, 받아온 파일들을 이용.. 더보기