DAO에 트랜잭션을 적용해보면서 스프링이 어떻게 성격이 비슷한 여러 종류의 기술을 추상화하고 이를 일관된 방법으로 사용할 수 있도록 지원하는 지 알아볼 것.


UserDao 는 단순 등록, 조회, 수정, 삭제를 하는 CRUD 에 맞추서 설계 및 구현되어있다. 이후 몇가지 기능을 더 추가한다.

  • 사용자 레벨 관리 기능을 추가

    • 사용자 레벨 BASIC / SIVER / GOLD

    • 처음 가입시 BASIC 이후 활동빈도에 따라 레벨 업

    • 가입 후 50회 이상 로그인 BASIC -> SIVER

    • 30번 이상 추천 받는 경우 SIVER -> GOLD

  • 필드를 추가
    • 각각의 레벨을 코드화시키는 경우

      일반적인 상수형 표현
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      class User{
          private static final int BASIC = 1;
          private static final int SILVER = 2;
          private static final int GOLD = 3;
          
          int level;
          
          public void setLevel(int level){
              this.level = level;
          }
          
          public int getLevel(){
              return level;
          }
      }
      cs

      level의 타입이 int 이기 때문에 실수값을 넣어도 컴파일러가 잡아내지 못하고 런타임때 에러를 발생시킨다. 또한 값을 벗어나는 경우도 있다.

      enum 타입으로 표현

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      public enum Level{
          BASIC(1),
          SIVER(2),
          GOLD(3);
          
          private final int value;
          
          Level(int value){
              this.value = value;
          }
          
          public int intValue(){
              return value;
          }
          
          public static Level valueOf(int value){
              switch(value){
              case 1:return BASIC;
              case 2:return SIVER;
              case 3:return GOLD;
              default:throw new AssertionError("Unknown value : " + value);
              }
          }
      }
      cs

(중략)
  • 코드 개선
트랜잭션 서비스 추상화
"사용자 레벨 관리 작업을 수행하는 도중에 네트워크가 끊기거나 서버에 장애가 생겨서 작업을 완료할 수 없다면, 그때까지 변경된 사용자의 레벨은 그대로 두는가? 아니면 모두 초기 상태로 되돌려 놓아야 하는가?"



Posted by doubler
,