Spring 72

45. 통합 테스트

단위 테스트 (Unit Test)하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트가 가능합니다.하지만 모듈 간에 상호 작용 검증은 할 수 없습니다.통합 테스트 (Integration Test)두 개 이상의 모듈이 연결된 상태를 테스트할 수 있습니다.모듈 간의 연결에서 발생하는 에러 검증 가능합니다.Spring Boot를 이용한 통합 테스트여러 단위 테스트를 하나의 통합된 테스트로 수행합니다.단위 테스트 시 Spring은 동작되지 않지만, 통합 테스트 시 Spring이 동작합니다.@SpringBootTestSpring IoC/DI 기능을 사용할 수 있습니다.Repository를 사용해 DB CRUD가 가능합니다.   통합 테스트 예시:@SpringBootTest(webEnvironment = Sprin..

Spring 2024.12.06

44. Mockito

Controller 클래스만 테스트할 수 없을까요?테스트 범위: Controller, Service, RepositoryService 클래스만 테스트할 수 없을까요?테스트 범위: Service, RepositoryRepository 클래스만 테스트할 수 없을까요?테스트 범위: Repository  아래 서비스 단에 있는 updateProduct 메서드를 테스트해보려 합니다. @Servicepublic class ProductService { // ... public static final int MIN_MY_PRICE = 100; // ... @Transactional public Product updateProduct(Long id, ProductMypriceRequestDt..

43. 단위 테스트

Unit Tests(단위 테스트): 개발자 테스트QA Testing:블랙박스 테스팅주로 QA 팀이 Production 환경-실 서비스 운영 환경과 유사한 환경(Stage)에서 테스팅테스트 코드를 작성한다면 프로그램의 버그를 사전에 발견하여 기하급수적인 비용의 증가 가능성을 사전에 방지할 수 있습니다.개발자는 단위 테스트를 작성하여 프로그램을 테스트 할 수 있습니다.단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법입니다.단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점이 있습니다.테스트 코드 전체를 한 번에 실행시킬 때 항상 코드가 작성된 순서대로 실행되지 않습니다.테스트 시 main 메서드가 실행되..

42. 고아 Entity 삭제

orphanRemovalCASCADE의 REMOVE 옵션을 적용하면 해당 Entity 객체를 삭제 했을 때 연관된 Entity 객체들을 자동으로 삭제할 수 있었습니다.하지만 REMOVE 옵션 같은 경우 연관된 Entity와 관계를 제거했다고 해서 자동으로 해당 Entity가 삭제 되지는 않습니다. 테스트를 위한 데이터 넣기.@SpringBootTestpublic class OrphanTest { @Autowired UserRepository userRepository; @Autowired FoodRepository foodRepository; @Test @Transactional @Rollback(value = false) void init() { ..

41. 영속성 전이

음식 테이블과 고객 테이블이 N : 1 양방향 관계라 가정해보겠습니다. @SpringBootTestpublic class CascadeTest { @Autowired UserRepository userRepository; @Autowired FoodRepository foodRepository; @Test @DisplayName("Robbie 음식 주문") // cascade = CascadeType.PERSIST 사용 X void test1() { // 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다. User user = new User(); user.setName("Robbie"); // 후라이드 ..

40. 즉시 로딩, 지연 로딩과 영속성 컨텍스트

지연 로딩과 즉시 로딩이란 무엇일까?  음식 테이블과 고객 테이블이 N : 1 양방향 관계라 가정해보겠습니다.  초기 데이터 넣기@SpringBootTestpublic class FetchTypeTest { @Autowired UserRepository userRepository; @Autowired FoodRepository foodRepository; @Test @Transactional @Rollback(value = false) void init() { List userList = new ArrayList(); User user1 = new User(); user1.setName("Robbie"); use..

39. Entity 연관관계 - N 대 M

@ManyToMany@ManyToMany 애너테이션은 N 대 M 관계를 맺어주는 역할을 합니다.음식 Entity(외래 키의 주인)와 고객 Entity가 N 대 M 관계라 가정하여 관계를 맺어보겠습니다.N : M 관계를 풀어내기 위해 중간 테이블(orders)을 생성하여 사용합니다-자동 생성됩니다.생성되는 중간 테이블을 컨트롤하기 어렵기 때문에 추후에 중간 테이블의 변경이 발생할 경우 문제가 생길 수 있습니다.   단방향  @Entity@Table(name = "food")public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; pri..

38. Entity 연관관계 - 1 대 N

@OneToMany@OneToMany 애너테이션은 1 대 N 관계를 맺어주는 역할을 합니다.음식 Entity와 고객 Entity가 1 대 N 관계라 가정하여 관계를 맺어보겠습니다.  단방향 코드에서 외래 키를 관리하는 주인은 음식 Entity이지만, 데이터  베이스에서 실제 외래 키는 고객 Entity가 가지고 있습니다. >>  음식 Entity가 @JoinColum 에너테이션이 붙은 필드를 가지고 있습니다. 1 : N에서 N 관계의 테이블이 외래 키를 가질 수 있기 때문에 외래 키는 N 관계인 users 테이블에 외래 키 컬럼을 만들어 추가합니다.하지만 외래 키의 주인이 음식 Entity이기 때문에, 음식 Entity가 고객 테이블의 외래 키 컬럼을 관리합니다. 단방향import java.util.Ar..

37. Entity 연관관계 - N 대 1

@ManyToOne@ManyToOne 애너테이션은 N 대 1 관계를 맺어주는 역할을 합니다.음식 Entity와 고객 Entity가 N 대 1 관계라 가정하여 관계를 맺어보겠습니다.  단방향  @Entity@Table(name = "food")public class Food { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private double price; @ManyToOne @JoinColumn(name = "user_id") private User user;}@Entity@Table(name = "users")public class U..

36. Entity 연관 관계 - 1 대 1

@OneToOne@OneToOne 애너테이션은 1 대 1 관계를 맺어주는 역할을 합니다.고객 Entity와 음식 Entity가 1 대 1 관계라 가정하여 관계를 맺어보겠습니다.  단방향 외래 키의 주인 정하기Entity에서 외래 키의 주인은 일반적으로 N(다)의 관계인 Entity 이지만 1 대 1 관계에서는 외래 키의 주인을 직접 지정해야합니다.외래 키 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다.@JoinColumn()은 외래 키의 주인이 활용하는 애너테이션입니다.컬럼명, null 여부, unique 여부 등을 지정할 수 있습니다. 음식 Entity가 외래 키의 주인인 경우  @Entity@Table(name = "food")public c..