본문 바로가기

Spring

(15)
AssertJ 1. 지원 AssertJ Core 3.x 에는 Java 8 이상이 필요 AssertJ Core 2.x 에는 Java 7 이상이 필요 2. 대표 메소드 기본: assertThat() isNotEqualTo, isEqualTo contains, isNotEmpty, isNotNull, isEmpty, isNull startsWith, endsWith 3. 예외 처리 @Test @DisplayName("IllegalArgument 예외 처리") void illegalArgs() { assertThatIllegalArgumentException().isThrownBy(() -> { throw new IllegalArgumentException("Illegal args!"); }).withMessage("%s!"..
Mockito & MockMvc @ExtendWith(MockitoExtension.class) class ItemRegisterControllerTest { @InjectMocks private ItemRegisterController itemRegisterController; @Mock private ItemRegisterService itemRegisterService; private MockMvc mockMvc; private ItemSaveForm saveForm; private ItemDTO itemDTO; ObjectMapper mapper = new ObjectMapper(); @Before public void initAll(){ mapper = new ObjectMapper(); mapper.setVisibility(..
HTTP 응답코드 1. 400대 에러 - 400(Bad Request) 서버가 클라이언트의 요청을 이해하지 못할 때 발생. (잘못된 문법, Method, header, 내용누락등) - 401(Unauthorized): 권한 없음(Authentication관련) - 403(Forbidden): 엑세스 금지 (Authorization 관련) - 404(Not Found): 클라이언트가 요청한 문서를 찾지 못함. - 405(Method not allowed): 메소드 매칭이 되지 않을때 -406(Not Acceptable): 클라이언트가 Accept-*헤더에 지정한 항목 관해 처리할 수 없음. - 415( : 지원되지 않는 형식의 요청이라 서버가 승인 거부. 2. 500대 에러 - 500(Internal Server Error..
스프링 테스트중 에러 1. 첫번째 에러 java.lang.AssertionError: Status expected: but was: - @Getter가 없어서 자주 발생하는 에러라고 한다. 이 경우에는 DTO에 @Getter의 부재로 Jackson라이브러리의 직열화/역질렬화에서 오류가 생겼다. (Jackson라이브러리가 response를 보낼때 DTO를 직렬화 시키는데 Getter의 부재로 그러지 못하여 406 Not Acceptable에러가 나왔다.) 2. 두번째 에러 Strict stubbing argument mismatch. Entity를 테스트용으로 만들어서 스터빙 했지만 리포지토리에서 돌아오는 엔티티는 실제상황에서 내가 서비스 코드에 주입하여 JPA 로 보낸 엔티티와 다르다. 그래서 미스매치. 이 경우 내가 제작한..
컴포넌트 스캔 1. @ComponentScan @Bean붙일 필요 없이 @Component적힌 자동 스프링 빈 등록 (하나의 AppConfig로 관리 안해도 됨.) @ComponentScan시 @Configuration 붙은 설정들도 자동 등록 됨 basePackages를 이용해 시작 위치를 지정할 수 있다. 이때 이 패키지를 포함해서 하위 패키지를 모두 탐색 basePackage = { "hello.core", "hello.service"} 이렇게 여러 시작 위치 지정할 수도 있다. 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다. 권장방법1: 설정 정보클래스의 위치를 프로젝트 최상단에 두기 권장방법2: 스프링 부트면 @SpringBootApplication를 프로젝트..
싱글톤 (웹과 관련하여) 1. 스프링과 비교 웹 어플리케이션은 보통 여러 고객이 동시에 요청 스프링없는 순수한 DI 컨테이너는 AppConfig 요청을 할떄마다 객체 생성. 객체 인스턴스를 생성하는 비용이 1000 이라면 가져오는 비용은 1정도로 차이가 큼. 2. 싱글톤 패턴의 문제점 싱글톤 패턴 구현 코드 많이 들어감. 의존 관계상 클라이언트가 구체 클래스에 의존(DIP 위반) 클라이언트가 구체 클래스에 의존해서 OCP위반 가능성 높음. 테스트 하기 어려움. 내부 속성을 변경ㅎ거나 초기화 하기 어렵다. private생성자로 자식 클래스를 만들기 어렵다. 결론적으로 유연성 떨어진다. 안티패턴으로 불리기도 한다. 3. 싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리한다. 스프링..
의존성 자바코드 기반 1. 기본적인 방식의 의존 MemberService service = new MemberServiceImpl(); 문제점: OCP & DIP 문제 특히 DIP에서는 인터페이스와 구현 클래스 함께 의존 2. AppConfig를 통해 의존성 분리 public class AppConfig{ public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } } //Impl 생성자 public MemeryServiceImpl(MembmerRepository m..
JPA Basics - JPQL Advanced 1. 경로 표현식 ◍ 경로표현식: .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username -> 상태 필드 from Member m join m.team t. -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' ◍ 용어 정리 ○ 상태필드(state field): 단순히 값을 저장하기 위한 필드(ex> m.username) ○ 연관필드(association field): 연관 관계를 위한 필드 ◼ 단일값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex> m.team) ◼ 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex> m.orders) ◍ 특징 ○ 상대 필드 ..
JPA Basic - JPQL Basic 0. 기본 ◍ JPQL: 엔티티 객체를 대상으로 쿼리 ◍ JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공. ◍ 검색 조건이 있는 쿼리가 필요할 때 사용. ◍ 동적쿼리: Criteria 보다 쿼리DSL ◍ QueryDSL ○ 문자가 아닌 자바코드로 JPQL 작성 가능 ○ JPQL빌더 역할 ○ 컴파일 시점에 문법 오류를 찾을 수 있음 ○ 동적 쿼리 작성 편리함 ○ 단순하고 쉬움 ○ 실무사용 권장! ◍ 네이티브 SQL ○ JPA가 제공하는 SQL을 직접 사용하는 기능 ○ JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능 EX> 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트 ◍ JDBC 직접 사용, SpringJdbcTemplate 등 ○ JPA를 사용하면서 JD..
JPA Basic - 값 타입 1. 기본 값 타입 ◍ JPA의 데이터 타입 분류 ○ 엔티티 타입 ◼ @Entity로 정의하는 객체 ◼ 데이터가 변해도 식별자로 지속해서 추적 가능 ○ 값 타입 ◼ int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 ◼ 식별자가 없고 값만 있으므로 변경시 추적 불가 ◍ 값타입 분류 ○ 기본 값 타입: 자바 기본 타입(int, double)/ 래퍼 클래스(Integer, Long)/ String ○ 임베디드 타입: 복합 값타입 ○ 컬렉션 값타입 ◍ 기본값 타입 ○ 생명 주기를 엔터티에 의존 ○ 값 타입은 공유하면 안됨. ○ 자바의 기본 차입은 절대 공유 불가. ◼ int,double같은 기본 타입은 절대 공유 못함 ◼ 기본 타입은 항상 값을 복사함. ◼ Integer..