티스토리 뷰

 

📌 231017 TIL : [Spring-boot] 개발자 키우기 프로젝트

H2 데이터베이스, ENUM 클래스 

 


1. H2 Database?

스프링 부트가 지원하는 인메모리 관계형 데이터 베이스 

즉 Mysql 같은 RDBMS.

메모리에 담는 DB라서, 끄면 데이터들도 같이 삭제된다. 

그래서 과제나 테스트시 유용. 

용량이 가볍고, 로컬 환경, 테스트 환경에서 많이 쓰임. 

 

인메모리 데이터베이스 (In-Memory Database) : 디스크가 아닌 주 메모리에 모든 데이터를 보유하는 데이터 베이스. 디스크 검색보다 접근이 훨씬 빠르다는 장점이 있다. 단점은 휘발성으로, 서버 전원을 끄면자료들이 삭제된다. 그래서 보통 로그인 세션같은 서버가 꺼져도 상관없은 임시 데이터에 많이 사용된다. 

 

📝 gradle 주입 방법 

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compileOnly 'org.projectlombok:lombok'
...
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

📝 Gradle에서 의존성 주입할 때의 키워드 차이 

runtimeOnly ? 

라이브러리가 런타임에만 필요하다는 것을 의미함. 

프로젝트 빌드 시점에 해당 라이브러리를 추가하지 않고, 런타임시에만 라이브러리를 프로젝트에 포함함. 

 

complieOnly ?

라이브러리가 컴파일 시점에만 필요함. 이 옵션을 사용하면 프로젝트 빌드 시점에서 해당 라이브러리를 사용하고, 빌드된 결과물에선 포함하지 않음. 즉 컴파일 시점에서만 라이브러리를 참조함. 

예를 들어 프로젝트에서 테스트 코드를 작성할 때, junit 라이브러리를 compileOnly로 설정하여, 테스트코드 컴파일 시에만 참조할 수 있도록 함. 

 

Implementation ?

라이브러리가 컴파일, 런타임 둘다 필요함. 프로젝트 빌드 시점에 해당 라이브러리를 컴파일에 사용하고, 빌드된 결과물에도 포함됨. 라이브러리와 관련된 클래스 메소드를 프로젝트에서 직접 참조도 가능함. 

 


2. Enum 클래스?

 

Enumerated type의 줄임말로 열거형이라고도 불림.

열거형, 이넘(enum)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형

enum은 상수 그룹(final 변수처럼 바꿀 수 없는 변수)을 나타내는 특수한 클래스다. 

대문자로 써서 쉼표로 구분하고 enum 키워드를 붙이면 된다. 

 

📝 장점

  • 문자열과 비교해, IDE의 적극적인 지원을 받을 수 있다. 
  • 허용 가능한 값들을 제한할 수 있다.
  • 리팩토링시 변경 범위가 최소화 할 수 있다.

 

📝 특징

  • 클래스를 상수처럼 사용 할 수 있다.
  • Enum 클래스에서 선언한 상수들은 클래스가 로드될 때 하나의 인스턴스로 생성되어 싱글톤 형태로 어플리케이션 전체에서 사용된다. 
  • 서로 관련 있는 상수 값들을 모아 enum으로 구현하는 경우 유용하다.
  • 클래스와 같은 문법 체계를 따른다.
  • 상속을 지원하지 않는다.

 

📝 Enum의 내부 Api

 

1. values()

  • values() 는 Enum 클래스가 가지고 있는 모든 상수 값을 배열의 형태로 리턴 한다. 참고로 단순히 String 의 형태로 단순 반환하는 것이 아니라 인스턴스를 반환하는 것이다. 즉 Enum 클래스가 가지고 있는 모든 인스턴스를 배열에 담아 반환하는 것이다.

2. valueOf()

  • valueOf() 메서드는 String 을 파라미터로 받는데 인자로 들어온 String 과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환한다. 이 또한 마찬가지로 단순히 문자열을 반환하는 것이 아니라 인자로 들어온 문자열과 일치하는 인스턴스를 반환하는 것이다.

3. ordinal()

  • Enum 클래스 내부에 있는 상수들의 Index 리턴하는 메소드이다. 배열과 마찬가지로 0부터 인덱스가 시작하며 인덱스의 length 상수의 - 1 이다.

 

📝 사용 예제 

 

예시 1) 개발자 키우기 중 개발자 레벨 (주니어, 중니어, 시니어)를 정의하고 싶을 때.

@AllArgsConstructor
@Getter
public enum DeveloperLevel {
    NEW("신입 개발자"),
    JUNIOR("주니어 개발자"),
    JUNGNIOR("중니어 개발자"),
    SENIOR("시니어 개발자");

    private final String description;
}

 

 

Entity 클래스에서 @Enumerated(EnumType.String) 을 통해 validataion을 진행한다. 

@Entity
public class Developer {

    @Enumerated(EnumType.STRING)
    private DeveloperLevel developerLevel;

    @Enumerated(EnumType.STRING)
    private DeveloperSkillType developerSkillType;

}

 

 

예시 2) 사용자 커스텀 예외처리 클래스에서 예외 메세지를 eunm으로 처리하는 경우

@AllArgsConstructor
@Getter
public enum DMakerErrorCode {
    NO_DEVELOPER("해당되는 개발자가 없습니다."),
    DUPLICATED_MEMBER_ID("MemberId가 중복되는 개발자가 있습니다."),
    LEVEL_EXPERIENCE_YEARS_NOT_MATCHED("개발자 레벨과 연차가 맞지 않습니다."),
    INTERNAL_SERVER_ERROR("서버에 오류가 발생했습니다."),
    INVALID_REQUEST("잘못된 요청입니다.")
    ;

    private final String message;
}

 

비즈니스 로직을 처리하는 부분에서 유효처리를 진행할 때, 예외를 던질 때 예외메세지를 담아 보내기 유용하다. 

예를 들어 개발자 레벨이 Senior인데, 개발 경력이 10년 미만이면 예외를 검증하고 싶다면, 

LEVEL_EXPERIENCE_YEARS_NOT_MATCHED("개발자 레벨과 연차가 맞지 않습니다.") 메세지를 담아 보낸다. 

if (developerLevel == DeveloperLevel.SENIOR && experienceYears < 10) {
	throw new DMakerException(LEVEL_EXPERIENCE_YEARS_NOT_MATCHED);
}

 

 

 

 

 

출처-

https://techblog.woowahan.com/2527/

https://velog.io/@kyle/%EC%9E%90%EB%B0%94-Enum-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9