Spring Boot (22) 썸네일형 리스트형 [SpringBoot] 연관관계의 주인이 필요한 이유 Summary:DB의 연관관계 방식은 JPA에서의 방식과 차이가 있음 : FK로 관리 vs 다른 엔티티 참조 이를 일치시키기 위해서 양방향 관계에서는 mappedBy로 연관관계의 주인을 설정해줘야함추가로, 객체의 관점에서 일관성을 유지하기 위해 주인 엔티티만 수정할 뿐 아니라 상대 엔티티도 수정할 필요 있음 → 연관관계 편의 메서드 📌 DB와 JPA의 연관관계 차이점데이터 베이스에서는 하나의 외래키를 이용해 두 테이블을 join 하는 구조JPA에서는 한 엔티티가 다른 엔티티를 참조하는 구조이런 JPA의 특성 때문에 '방향성'이 생기는 것 => 단방향과 양방향단방향 : 하나의 엔티티가 다른 엔티티를 참조하는 것양항뱡 : 각 엔티티가 서로의 엔티티를 참조하는 것 (단방향 2개)정리하자면, DB : 외래키.. [SpringBoot] H2를 테스트용 DB로 사용하기 📌 테스트용 DB로서의 H2 DB관련 테스트에는 인메모리 방식의 DB인 H2가 많이 사용됨 1. 테스트 과정에서 데이터가 영향을 받을수 있으며 2. H2를 이용하면 더 빨리 테스트할 수 있기 때문 임베디드 H2를 사용하려면 의존성을 추가해줘야 함 # gradle dependencies { testRuntimeOnly 'com.h2database:h2' } 🤔 테스트 데이터를 롤백하면 굳이 H2를 쓸 이유가 없지 않나? 테스트 데이터가 롤백되어 DB에 남아있지 않더라도, auto increment로 지정한 ID가 증가되는 등의 문제가 발생할 수 있음 => 테스트용 DB 필요 참고 : https://jungguji.github.io/2020/07/05/H2-DB%EB%A5%BC-%EC%9D%B4%EC%9A%.. [SpringBoot] 테스트 코드 가독성 높이기 - BDDMockito, assertj 📌 테스트 코드 가독성 높이기 - BDD 적용💡 BDDBehavior-Driven Development(행위 주도 개발) 의 약자 이를 테스트에 적용시키면, 테스트 대상의 상태의 변화를 시나리오(given-when-then)을 기반으로 테스트하는 방법 💡 BDDMockito 테스트 코드가 시나리오(given-when-then)에 맞게 읽히도록 개선된 Mockito Framwork Mockito를 상속하며, 기능도 동일하지만 BDD 구조로 쉽게 읽힐 수 있도록 도와주는 것 💡 Mockito -> BDDMockito ① when을 given으로 Mockito 코드에서는 메서드와 그 행동을 설정할 때 when을 이용함 하지만 이 부분은 시나리오 상 given에 해당하므로 BDDMockito에서는 네.. [SpringBoot] @Mock vs @MockBean 📌 어떤 객체를 Mock 객체로 선언하는 방법 1️⃣ mock() PostRepository postRepository = mock(PostRepository.class); 2️⃣ @Mock @Mock private PostRepository postRespository; + @Mock을 쓰려면 테스트 클래스 위에 @ExtendWith(MockitoExtension.class)를 붙여줘야 함 ①과 ②는 내부적으로 동일하게 동작함. 무엇을 쓰는지는 방법의 차이 3️⃣ @MockBean @MockBean private PostRepository postRespository; 스프링 부트 테스트에서 제공하는 어노테이션 스프링 컨텍스트에 Mock 객체를 등록하고, 스프링 컨텍스트에 의해 @Autowired가 동.. [SpringBoot] 7.4.7 서비스 테스트 Summary : 서비스 테스트는 given - 레포지토리의 메소드가 특정 값을 리턴한다고 가정 (given / willReturn) when - 서비스의 특정 함수가 호출되었을 때 then - 해당하는 형식을 리턴하는지 (assertThat) 해당하는 레포지토리의 함수가 호출되었는지 (then(class).should(method)) 를 체크한다. 📌 서비스 레이어에 적합한 테스트 서비스는 외부 요인(서블렛, DB)을 배제하고 테스트할 수 있는 레이어 => 스프링 컨테이너를 제외하고 테스트하도록 서비스 레이어에 적합한 테스트 필요 => 유닛 테스트 📌 @ExtendWith 단위 테스트에 공통적으로 사용할 '확장 기능을 선언'해주는 역할 인자로 확장할 Extension을 지정 -> 주로 SpringExt.. [SpringBoot] 7.4.5-6 컨트롤러 테스트 Summary : 컨트롤러 테스트는 given - 서비스의 메소드가 특정 값을 리턴한다고 가정 (given / willReturn) when - 특정 요청이 왔을 때 (mockMvc.perform) then - 해당하는 형식의 응답인지 (andExpect / andDo) 해당하는 서비스의 메소드가 호출되었는지 (verify) 를 체크한다. 🔍 목차 7.4.5 스프링 부트에서의 테스트 7.4.6 컨트롤러 객체의 테스트 7.4.6.1 컨트롤러 테스트 코드의 요소 1 - MockMvc 7.4.6.2 컨트롤러 테스트 코드의 요소 2 - 어노테이션 7.4.6.3 컨트롤러 테스트 코드의 요소 3 - verify 7.4.6.4 컨트롤러 테스트 코드 예시 7.4.6.5 스프링 시큐리티 인증이 포함된 컨트롤러 테스트 📌.. [SpringBoot] 7.1-4 테스트 코드 📌 7.1 테스트코드를 작성하는 이유 개발 과정에서 문제를 미리 발견할 수 있음 사이드 이펙트를 테스트할 수 있음 (내가 코드를 수정함으로써 다른 코드에 영향이 가는지) 애플리케이션을 가동해서 하는 테스트보다 빠른 테스트를 할 수 있음 협업을 할 때 명세 문서로서의 기능을 수행함 코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지할 수 있음 오류가 발생할 수 있는 상황을 만들어서 오류를 테스트할 수 있음 cf. 테스트 코드를 작성하는 것과 TDD는 엄연히 다르다. TDD는 테스트코드를 먼저 짜고 그것을 명세서 삼아 코드를 작성하는 것 📌 7.2 단위 테스트와 통합 테스트 단위 테스트(Unit Test) 개별 모듈을 독립적으로 테스트하는 것 일반적으로 메서드 단위로 테스트.. 스프링 시큐리티를 이용한 로그인 📌Intro 스프링 시큐리티를 이용한 로그인은 회원가입보다 다소 복잡하다. 아래와 같은 순서로 진행된다. SecurityConfig에 로그인, 로그아웃 URL 등록 SignInController에 매핑 함수 구현 sign-in.html을 타임리프로 작성 UserRole enum 생성 UserSecurityService 로 권한 관리 SecurityConfig에 AuthenticationManager 빈을 생성 로그인 / 로그아웃에 따라서 네비 바 바꾸기 📌 SecurityConfig에 로그인, 로그아웃 URL 등록 @Configuration @EnableWebSecurity public class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpS.. 이전 1 2 3 다음