23.03.06[취준 일지] 혼자 구현하는 웹사이트
package com.example.aws.web;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@SpringJUnitConfig
@WebMvcTest(controllers = HelloControllerTest.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void helloTest() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("hello"));
}
}
- @SpringJUnitConfig 어노테이션은 테스트 클래스가 Spring Boot 애플리케이션 컨텍스트를 로드하여 사용할 수 있도록 합니다.
- @WebMvcTest(controllers = HelloController.class) 어노테이션은 HelloController 클래스를 테스트하기 위해 필요한 빈들만 로드하여 테스트할 수 있도록 합니다.
- private MockMvc mockMvc 필드는 Spring의 MockMvc 객체를 주입받아 테스트에서 사용할 수 있도록 합니다.
- helloTest() 메소드는 HelloController의 /hello API endpoint가 제대로 동작하는지 확인하는 테스트입니다. MockMvcRequestBuilders.get("/hello")를 호출하여 /hello 경로로 GET 요청을 보내고, MockMvcResultMatchers.status().isOk()를 사용하여 응답 코드가 200인지 확인하며, MockMvcResultMatchers.content().string("hello")를 사용하여 응답 본문이 "hello"인지 확인합니다.
따라서, 이 테스트를 실행하면 /hello 경로로 GET 요청이 들어왔을 때 응답 코드가 200이고, 응답 본문이 "hello"인지 확인합니다.
HelloResponseDto 클래스에 대한 테스트 코드 예시입니다.
java
Copy code
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public void lombokTest() {
// given
String name = "test";
int amount = 1000;
// when
HelloResponseDto dto = new HelloResponseDto(name, amount);
// then
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
. given에서는 name과 amount 변수를 초기화하고, when에서는 HelloResponseDto 객체를 생성합니다. 이후 then에서는 생성된 객체의 getName()과 getAmount() 메소드를 통해 값이 제대로 저장되었는지를 검증합니다.
assertThat은 org.assertj.core.api 패키지에 속한 테스트 검증 라이브러리로, JUnit에서 제공하는 Assert보다 더 다양한 기능을 제공합니다. isEqualTo 메소드는 assertThat의 결과와 인자로 전달한 값이 같은지를 검증합니다.
스프링 부트 JPA 란?
자바표준인 JPA(JAVA Persistence API)를 스프링 부트에서 사용할 수잇게 해주는 모듈. 객체지향 프로그래밍에서 관계형 데이터 베이스를 사용하는데 필요한 API를 제공하며, 이를 통해 객체와 테이블 간의 매핑을 쉽게 구현가능
스프링 부트에서 JPA를 사용할때 필요한 설정을 자동으로 처리
EX) 1. 데이터베이스와의 연결을 위한 DataSource
2. 구현체인 Hibernate등을 자동으로 설정해주고 또한 엔티티 클래스와 테이블간 매핑을 위한 어노테이션 제공
구현체들을 쉽게 더 사용하고하 추상화 시킨 Spring Data JPA
등장한이유
- 구현체 교체용이성 - hibernate 외에 다른 구현체로 쉽게 교체하기위함(내부에서 구현체 매핑을 지원해주기 때문)
- 저장소 교체 용이성 - 관계형 데이터 베이스 외의 다른 저장소로 쉽게 교체하기 위함
객체지향 프로그래밍과 관계형 데이터 베이스 둘다 이해해야함
객체지향 프로그래밍(Object-Oriented Programming, OOP)과 관계형 데이터베이스(Relational Database, RDB)는 모두 소프트웨어 개발에서 중요한 개념입니다.
객체지향 프로그래밍은 현실 세계의 객체(Object)들을 프로그래밍에 반영하는 개념으로, 객체는 데이터와 해당 데이터를 처리하는 함수(method)를 하나의 단위로 묶어서 표현합니다. 이런 객체를 통해 코드의 재사용성과 유지보수성이 향상되는 장점이 있습니다.
반면에 관계형 데이터베이스는 데이터를 테이블(table) 형태로 저장하고, 테이블 간의 관계(Relationship)를 이용하여 데이터를 구성합니다. 데이터의 구성 방식 자체가 객체지향 프로그래밍에서의 객체 구성과는 다릅니다. 하지만 대규모 데이터의 저장과 처리에서는 RDB가 빠른 처리 속도와 안정성을 보장하기 때문에 여전히 많이 사용되고 있습니다.
따라서 객체지향 프로그래밍과 관계형 데이터베이스는 서로 다른 개념이지만, 이 두 가지를 조화롭게 사용하는 것이 좋습니다. 이를 위해서는 객체를 테이블에 매핑하는 ORM(Object-Relational Mapping) 기술이 필요합니다. 대표적인 ORM 프레임워크로는 Hibernate, JPA 등이 있습니다. 이러한 ORM 기술을 이용하여 객체와 테이블 간의 매핑을 쉽게 처리할 수 있으며, 객체지향적인 개발과 RDB의 이점을 모두 살릴 수 있습니다.