스프링 프레임 워크 정리

kdew0308·2023년 3월 3일
0

자바

목록 보기
8/8

1) Junit

1-1) 정의

  • Java에서 독립된 단위테스트 (Unit test)를 지원해주는 프레임워크
  • 번거롭게 디버깅하지 않아도 되며, 프로그램 테스트 시 걸릴 시간도 관리할 수 있는 기능을 가지고 있습니다.
  • 테스트 결과를 확인하는 것 이외 최적화된 코드를 유추해내는 기능도 제공
  • 테스트 결과를 단순한 텍스트로 남기는 것이 아니라 Test클래스로 남깁니다. 그래서 개발자에게 테스트 방법 및 클래스의 History를 넘겨줄 수도 있습니다.

단위 테스트

특정 소스코드의 모듈이 의도한 대로 작동하는지 검증하는 테스트이다.
즉, 함수 및 메소드에 대한 테스트를 하는 작업.
Spring에서 단위테스트를 하는것은 스프링 커네이너에 올라와있는 Bean들을 테스트 하는 것이다.
Junit을 사용하면 스프링 컨테이너를 띄워, 그 위에 올라가있는 Bean을 테스트 할 수 있다.

1-2) JUnit 특징

  • 단정 메서드(assert)로 테스트 케이스의 수행결과를 판별.
    • ex) assertEquals(예상값, 실제값)
    • assert()는 junit의 대표적인 기능이다. 이 메소드를 사용하여 테스트가 정상인지 아닌지 판별한다.
  • Junit 4부터는 테스트 어노테이션을 제공
    • ex) @Test @Before @After
  • 각 @Test 어노테이션 메서드 호출 시 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지도록 함.
  • 결과는 성공(녹색), 실패(붉은색) 중 하나로 표시

1-3) JUnit 테스트 어노테이션

@Test

  • 메서드에 @Test를 선언 : 테스트를 수행하는 메소드라는 의미
  • JUnit은 각각의 테스트가 서로 영향을 주지않고 독립적으로 실행되는 것을 원칙으로 하기때문에 @Test메소드마다 객체를 별도로 생성한다.

@Before

  • @Before 어노테이션이 선언된 메소드는 @Test 메소드가 실행되기 전 반드시 실행한다.
  • 보통 공통으로 사용되는 set-up 코드를 @Before메소드에 선언한다. @Before은 각 메서드 전에 실행되는데, 같은 환경에서 여러 메소드를 테스트하는 경우 단위테스트 전체 수행 전 @BeforeClass 어노테이션 선언으로 1번만 선언하면 된다

@After

  • @After 어노테이션이 선언된 메소드는 @Test 메소드가 실행된 후 반드시 실행한다. 마찬가지로 전체 수행 후에는 @AfterClass 어노테이션 선언

@Ignore

  • @Ignore 어노테이션을 선언하면 테스트를 Skip한다.

1-4) 테스트 방법

  1. src/test/java
    이하에 테스트 패키지를 생성후, 테스트 클래스 생성.

  2. 테스트 메소드 작성.
    스프링 컨테이너 객체 생성, 빈 의존성 주입 작업 후, 테스트할 메소드를 호출한 리턴값을 assert()로 검사한다.
    (system out으로 console에 찍어볼수도 있겠다)

// 기존 
public class Calculator {
		public int sum(int num1, int num2) {
			return num1 + num2;
		}
}
// 테스트 코드
class CalculatorTest {
	    @Test
        void testSum(){
            Calculator calculator = new Calculator();
            assertEquals(6, calculator.sum(1,2));
		}
}
  1. 테스트 실행
  • 테스트하고자 하는 메소드에 @Test 어노테이션을 선언해주면 파일 우클릭> Run as > Junit Test 버튼이 활성화 된다.

1-5) Spring-Test에서 테스트를 지원하는 어노테이션

@RunWith(SpringJUnit4ClassRunner.class)

  • SpringRunner클래스는 JUnit Test에서 Spring Application Context 에 빈을 등록하고 @Autowired 어노테이션을 지원한다.

@ContextConfiguration({"파일경로"})

  • 스프링 빈 설정파일의 위치를 지정하는 어노테이션
    ex) @ContextConfiguration({"classpath:config/*.xml"})
  • 파라미터로 스프링 빈 설정파일 경로를 넣어주면, 테스트 케이스를 실행할때 마다 설정파일을 로딩시켜준다.

@Autowired

  • 스프링 의존성주입(DI)을 대신해준다.
  • 해당 변수에 자동으로 빈을 매핑해 준다.

1-6) 단정 메소드

assertEquals(x, y)

  • 객체 x와 y가 일치함을 확인합니다.
  • x(예상 값)와 y(실제 값)가 같으면 테스트 통과

assertArrayEquals(a, b);

  • 배열 A와 B가 일치함을 확인합니다.

assertFalse(x)

  • x가 false 인지 확인합니다.

assertTrue(x)

  • x가 true 인지 확인합니다.

assertTrue(message, condition)

  • condition이 true이면 message표시

assertNull(o)

  • 객체o가 null인지 확인합니다.

assertNotNull(o)

  • 객체o가 null이 아닌지 확인합니다.

assertSame(ox, oy)

  • 객체 ox와 oy가 같은 객체임을 확인합니다.
  • ox와 oy가 같은 객체를 참조하고 있으면 테스트 통과
  • assertEquals()메서드는 두 객체의 값이 같은지 확인하고, assertSame()메서드는 두 객체의 레퍼런스가 동일한가를 확인합니다. (== 연산자)

assertNotSame(ox, oy)

  • ox와 oy가 같은 객체를 참조하고 있지 않으면 통과

assertfail()

  • 테스트를 바로 실패처리

2) Enum 클래스

2-1) 정의

  • 데이터 중에서는 요일 ( 월, 화, 수, 목, 금, 토, 일 ), 계절( 봄, 여름, 가을, 겨울) 등과 같이 몇 가지 한정된 값을 갖는 경우가 흔히 있습니다. 요일, 계절과 같이 한정된 데이터만을 가지는 타입을 Enumeration Type이라고 하며 열거타입에 들어가는 값( 월, 화 ,수 등 )들열거 상수( Enumeration constant)라고 합니다.
  • 관례
    • 열거타입을 선언하기 위해서는 JAVA Class 명처럼 열거타입의 이름을 정하고 타입이름으로 첫 글자 대문자로 하여 .java 파일을 생성
    • JAVA 파일 안에서 class대신 enum을 적어줍니다.
    • 열거상수를 적을 때는 관례로 대문자로 적습니다. 만약 열거상수가 2개의 단어로 연결되어 있을 때는 _로 연결하는 것이 관례
// enum을 사용하지않고 상수값 정의
public static final String MON = "Monday";
public static final String TUE = "Tuesday";
public static final String WED = "Wednesday";

// enum을 사용해서 상수값 정의
public enum Week {
    MONDAY, TUSEDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

// 사용 방법
Week.MONDAY
Rainbow.RED

2-2) 특징

  • 열거체를 비교할 때 실제 값뿐만 아니라 타입까지도 체크합니다.
  • 열거체의 상숫값이 재정의되더라도 다시 컴파일할 필요가 없습니다.
  • 필드값을 추가할 때 이름을 name 으로 정하는건 피하는게 좋습니다. Enum 클래스 자체에서 name() 이라는 메소드를 제공하기 때문에 헷갈릴 수 있습니다.

2-3) 생성자와 final 필드 추가

만약에

public enum Day {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

이렇게 되어있는 Enum클래스가 있을 때 각 요일의 풀네임이 필요할 때가 있음

public enum Day {
    MON("Monday"),
    TUE("Tuesday"),
    WED("Wednesday"),
    THU("Thursday"),
    FRI("Friday"),
    SAT("Saturday"),
    SUN("Sunday")
    ;

    private final String label;

    Day(String label) {
        this.label = label;
    }

    public String label() {
        return label;
    }
}

enum Rainbow {

    RED(3), ORANGE(10), YELLOW(21), GREEN(5), BLUE(1), INDIGO(-1), VIOLET(-11);

 

    private final int value;

    Rainbow(int value) { this.value = value; }

    public int getValue() { return value; }

}

Enum 요소에 특정 값을 매핑하고 싶다면 위 코드처럼 필드값을 추가하면 됩니다.
여기서는 label 이라는 String 값을 추가했습니다.
필드값을 추가하면 생성자도 함께 추가해야하는데 Enum 클래스는 생성자가 있다고 하더라도 new 연산으로 생성할 수 없습니다.

System.out.println(Day.MON.name());      // MON
System.out.println(Day.MON.label());     // Monday

이렇게 규칙이 존재하는 특정 요소들을 하나의 Enum 클래스로 묶어두면 가독성도 좋아지고 if 문으로 일일히 검사할 필요도 없어서 편리합니다.

2-4) values() 메소드

  • values() 메소드는 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

public class Enum01 {
    public static void main(String[] args) {
        Rainbow[] arr = Rainbow.values();
        for (Rainbow rb : arr) {
            System.out.println(rb);
        }
    }
}
/*결과
RED
ORANGE
YELLOW
GREEN
BLUE
INDIGO
VIOLET
*/

2-5) valueOf() 메소드

  • valueOf() 메소드는 전달된 문자열과 일치하는 해당 열거체의 상수를 반환
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

public class Enum02 {
    public static void main(String[] args) {
        Rainbow rb = Rainbow.valueOf("GREEN");
        System.out.println(rb);
    }
}
//결과 GREEN

2-6) ordinal() 메소드

  • ordinal() 메소드는 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

public class Enum03 {
    public static void main(String[] args) {
        int idx = Rainbow.YELLOW.ordinal();
        System.out.println(idx);
    }
}
//결과 2

0개의 댓글