(SpringBoot) MVC 테스트 하기 - `@WebMvcTest`, `@AutoConfigureMockMvc`

|

SpringBoot Reference에 접속하여 목차를 보면 거의 끝쯤에 Testing관련 내용이 나옵니다. 이 중 SpringBoot의 Controller를 JUnit으로 테스트 하고 싶은 경우 41.3.7 Auto-configured Spring MVC tests를 보면 Http Connection을 별도 구현하지 않고도 MVC 테스트를 가능하게 하는 설명이 나옵니다.

캡처화면

@WebMvcTest

일반적으로 사용하는 MVC테스트용 어노테이션입니다. 해당 어노테이션을 명시하고 그림과 같이 MockMvc@Autowired하면 해당 객체를 통해 MVC테스트가 가능합니다.

@WebMvcTest사용시 주의사항 1

@WebMvcTest어노테이션 사용시 @SpringBootTest을 같이 사용할 수 없습니다. 서로 MockMvc를 설정하기 때문에 충돌이 나는거 같은데요, MVC 기능만 사용할 거라면 @WebMvcTest를 사용하면 됩니다.

@WebMvcTest사용시 주의사항 2

@WebMvcTest 사용시 다른 설정들은 자동으로 올리지 않기 때문에 @Repository@Resource, @Service, @Component등은 사용할 수 없습니다. 아래 글과 같이 자동설정하는 영역은 @Controller, @ControllerAdvice, @JsonComponent 등등이네요. 그런데 저는 실제로 테스트 해보니 @ControllerAdvice도 먹히지 않았습니다. (이유는 아직도 모르는중…)

@WebMvcTest사용시 주의사항 3

@WebMvcTest가 포함하는 실제 설정은 Appendix D. Test auto-configuration annotations에서 확인 가능 합니다.

@WebMvcTest이 포함하는 설정

@AutoConfigureMockMvc

@WebMvcTest외에 MVC테스트를 할 수 있는 다른 방법입니다. 위 설정은 MVC테스트 외 모든 설정을 같이 올립니다. AOP도 되고 JPA Repository도 사용가능하네요. 실제적으로 동작하는 MVC테스트를 하려면 위 어노테이션을 사용해야 합니다. @AutoConfigureMockMvc@SpringBootTest와 같이 사용 가능합니다.

(SpringBoot) H2 DB 서버모드로 띄워 외부 툴(DBeaver)로 접속하기

|

SpringBoot에서 H2 DB Embedded를 사용하다보면 항상 console에 들어가 쿼리해야하는 불편함이 있어 외부 툴에서 접근하는 방법을 찾아 정리해 보았습니다.

우선 application.xml에 정의되 있는 아래 항목을 바꿔줍니다.

[변경 전]
spring.datasource.url=jdbc:h2:file:./db/devdb;

[변경 후]
spring.datasource.url=jdbc:h2:file:./db/devdb;AUTO_SERVER=TRUE

※ 주의사항 : H2 DB를 메모리 모드로 올릴 경우에는 사용 할 수 없습니다. 반드시 file모드로 올려주세요.

위와 같이 변경후 실행 시키면 서버모드로 뜨게 되고 DBeaver를 통해 아래와 같이 설정합니다.

  • “Create New Connect” 창을 띄우고 아래와 같이 “H2 - Embedded”를 선택합니다.

Create New Connect

  • Setting 화면에 아래와 같이 각 정보를 넣어줍니다. ※ JDBC URL 항목이 빈 란일 경우 “Driver Properties”탭을 선택하여 H2 Driver를 다운 받았는지 확인합니다. ※ 파일 경로를 full로 적어줘야합니다.

Create New Connect

  • Finish 버튼을 클릭하여 마무리.

Create New Connect

위와 같이 설정해도 한쪽에서 붙어 있는 상황에선 다른쪽이 붙질 못하더군요. 그 방법까진 아직 못찾아봐서 패스.

(JPA,SpringData) Date타입 컬럼 - Date, Calendar, Timestamp

|

JPA를 사용할때 Date타입의 컬럼 사용시 어떤 Java Object를 사용해야하는지에 대한 글이 있어 옮겨 적어봅니다. 원본보기

java.sql.Date, java.sql.Time, java.sql.Timestamp

@Column(name = "DATE_FIELD")
private java.sql.Date dateField;

@Column(name = "TIME_FIELD")
private java.sql.Time timeField;

@Column(name = "DATETIME_FIELD")
private java.sql.Timestamp dateTimeField;

@Column(name = "TIMESTAMP_FIELD")
private java.sql.Timestamp timestampField;

응용 프로그램이 날짜 및 시간 값을 저장하기만 해도 될 경우 사용합니다. 서버 GMT 오프셋과 같이 날짜 및 시간의 확장 된 세부 정보를 저장하거나 다른 지역 또는 시간대에 다른 날짜와 시간을 저장하지 않아도 될 경우에 좋습니다.

java.util.Date

@Temporal(TemporalType.DATE)
@Column(name = "DATE_FIELD")
private java.util.Date dateField;

@Temporal(TemporalType.TIME)
@Column(name = "TIME_FIELD")
private java.util.Date timeField;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATETIME_FIELD")
private java.util.Date dateTimeField;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TIMESTAMP_FIELD")
private java.util.Date timestampField;

프로그램의 날짜와 GMT값을 날짜,시간,타임스템프 필드와 함꼐 저장해야하는 경우에 사용합니다. java.util.Date 클래스는 날짜와 시간 정보를 모두 저장할 수 있기 때문에 올바른 TemporalType 속성 (TemporalType.DATE, TemporalType.TIME 또는 TemporalType.TIMESTAMP)이있는 @Temporal 주석이 추가로 필요합니다.

java.util.Calendar

@Column(name = "DATE_FIELD")
@Temporal(TemporalType.DATE)
private java.util.Calendar dateField;

@Column(name = "TIME_FIELD")
@Temporal(TemporalType.TIME)
private java.util.Calendar timeField;

@Column(name = "DATETIME_FIELD")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Calendar datetimeField;

@Column(name = "TIMESTAMP_FIELD")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Calendar timestampField;

국제 날짜및 시간정보 캡처가 필요한 경우 사용하면 좋습니다. java.util.Date 클래스와 마찬가지로 @Temporal주석이 필요합니다.

일반적으로 개발할때는 java.sql.Timestamp만 사용해도 충분하겠네요 :)

데이터베이스 정규화

|

정규화란?

데이터베이스의 설계에서 중복을 최소화 하게 데이터를 구조화

정규화의 목표

  • 데이터의 삽입,삭제,갱신 이상 제거
  • 자료저장 공간 최소화

정규화 단계

제1정규화(1NF)

  • 모든 속성은 반드시 하나의 값을 가짐(not null, 반복형태 X).
  • 레코드들은 서로 간에 식별 가능해야 합니다..

제2정규화(2NF)

  • 식별자가 아닌 모든 속성들은 식별자 전체 속성에 완전 종속되어야 합니다(완전함수종속).

제3정규화(3NF)

  • 2차 정규형을 만족하고 식별자를 제외한 나머지 속성들 간의 종속이 존재하면 안됩니다.

예제

2~3차정규화

entity(엔터티), attribute(속성), relationship(관계) 요약 - 암기용

|

학습 암기용 목적의 포스팅입니다.
자세한 내용은 엔터티(Entity), 속성(Attribute), 관계(Relationship)를 참고하세요.

1. Entity

Entity 개념

저장되기 위한 어떤 집합적인 것(Thing:사람,장소,물건,사건,개념).

엔터티 구성
출처 : http://tech.devgear.co.kr/db_kb/324

Entity 특징

  1. 업무에 필요한 정보
  2. 의미있는 식별자에 의해 인스턴스는 1개씩만 존재(중복배제)
  3. 2개이상의 인스턴스 집합으로 구성
  4. 업무프로세스에 의해 이용되어야 함
  5. 속성을 포함해야 함(식별자만 있으면 의미없음)
  6. 관계가 존재해야함

Entity 분류

  • 유무(有無)형에 따른 분류
명칭 설명
유형 엔터티
Tangible Entity
물리적 형태가 있음
ex:사원,물품,강사
개념 엔터티
Conceptual Entity
물리적 형태가 없음
ex:조직,보험상품
사건 엔터티
Event Entity
업무 수행에 따라 발생
ex:주문,청구,미납
  • 발생시점에 따른 분류
명칭 설명
기본 엔터티 원래 존재하는 정보
ex:사원,부서,고객,상품
중심 엔터티 기본엔터티로부터 발생하고 다른 엔터티와의 관계를 통해 많은 행위엔터티를 발생
업무에 있어 중심역활
ex:계약,사고,청구,주문
행위 엔터티 두개이상 부모엔터티로부터 발생
내용이 자주 바뀌거나 데이터량이 증가
ex:주문목록,로그인이력

2. Attribute

엔터티, 인스턴스, 속성, 속성값의 관계

관계도

  1. 한 개의 엔터티는 두 개 이상의 인스턴스의 집합.
  2. 한 개의 엔터티는 두 개 이상의 속성을 가짐.(식별자 외에 1개이상 필요)
  3. 한 개의 속성은 한 개의 속성값을 가짐.

속성의 특징

  • 업무에 필요한 정보
  • 주식별자에 함수적 종속성
  • 한 개의 속성값만 가짐, 다중값일 경우 별도의 엔터티를 이용하여 분리 필요

속성의 분류

  • 특성에 따른 분류
명칭 설명
기본속성 업무로 부터 추출한 값
ex:이름,전화번호,성별
설계속성 규칙화를 위해 변형/새로정의한 값
ex:과목코드,지역코드
파생속성 다른 속성에 영향을 받아 발생한 값
ex:예금이자,평균성적
  • 엔터티 구성방식에 따른 분류
명칭 설명
PK
Primary Key
엔터티를 식별할 수 있는 속성
FK
Foreign Key
다른 엔터티와의 관계에서 포함된 속성
일반속성 PK,FK에 포함되지 않은 속성
명칭 설명
단순형 원자값 속성
복합형 여러 세부 속성으로 나뉠수 있는 속성

도메인(Domain)

속성이 가질 수 있는 값의 범위

3. Relationship

관계의 정의

인스턴스 사이의 논리적인 연관성

관계의 패어링

엔터티 안에 인스턴스가 개별적으로 관계를 가지는것
패어링의 집합 -> 관계

관계와 패어링

관계의 표기법

  • 관계명(Membership) : 관계의 이름
  • 관계차수(Cardinality) : 1:1, 1:M, M:N
  • 관계선택사양(Optionality) : 필수관계(not null), 선택관계(nullable, O를 표시)

관계의 표기법