TIL - 0627

java-ims

ControllerAdvice, RestControllerAdvice

  • @RestController와 @Controller의 차이 : 응답 데이터가 json이냐 뷰(.html)냐 차이
  • @RestControllerAdvice : response를 json으로 변환해주는 역할, rest api 구현할 때 사용
  • 컨트롤러의 타입에 따른 예외처리 분기
    • 같은 타입의 예외지만 각기 다른 처리를 할 수 있음 : json 응답, redirect 혹은 특정 view 응답
/* RestController */
@RestControllerAdvice(annotations = RestController.class)
@Order(1)
public class SecurityRestControllerAdvice {
    ...
}

/* Controller */
@ControllerAdvice(annotations = Controller.class)
@Order(2)
public class SecurityControllerAdvice {
   ...
}

ResponseEntity static 메소드

  • ResponseEntity의 새로운 인스턴스를 생성해서 직접 만들어줄 수도 있지만, static 메소드를 통해서 ResponseEntity를 만들 수 있음
    • 빌더 패턴을 사용해서 체이닝을 할 수 있음
@ExceptionHandler(UnAuthenticationException.class)
public ResponseEntity<Void> handleRequireLogin() {
    log.debug("Rest Controller UnAuthenticationException is happened!");
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<Void> handleEntityNotFound() {
    log.debug("Rest Controller EntityNotFoundException is happened!");
    return ResponseEntity.badRequest().build();
}

jackson 사용할 때 주의할 점

  • get 메소드의 반환값을 모두 json 데이터로 변환하려고 함 : 선언되어있는 필드 기준이 아님
    • 객체가 반환된다면 해당 반환되는 객체의 get 메소드를 모두 변환하려고 함 : 콜렉션이면 변환 예외 발생함…. jackson 변환 flow를 살펴봐야할 듯
@Entity
public class Issue {
    
    @Embedded
    private Comments comments;
    
    
    // getComments가 없으면 변환하지않음(get 메소드 기준으로 변환함)
    public Comments getComments() {
        return comments;
    }
}

@Embeddable
public class Comments {

    private List<Comment> comments;
    
    
    @JsonIgnore // 해당 어노테이션을 붙이지않으면 변환하려고하다가 예외가 발생함
    public List<Comment> getComments() {
        return comments;
    }
}

JPA

  • 쿼리 메소드 사용없이 어노테이션을 통해서 where 쿼리 사용을 지정할 수 있음
@Embeddable
public class Comments {
    
    @OneToMany(mappedBy = "issue")
    @Where(clause = "deleted = false")
    private List<Comment> comments;
}

데이터베이스

DBMS는 미들웨어

  • 미들웨어는 어플리케이션과 OS 사이에서 구동되는 소프트웨어를 뜻함, OS가 아랫계층이기때문에 OS가 구동되고있어야만 DBMS가 구동될 수 있음
  • 보통 DBMS는 거의 모든 OS에서 사용할 수 있도록 지원함
    • 그렇더라도 OS와 DBMS 조합을 처음 설계할 때 잘 고려해야함 : 쉽게 옮길 수 있는 것이 아님 - 비용이 큼

RDBMS

정의

  • 2차원 표를 사용해서 데이터를 관리하는 데이터베이스를 뜻함
    • 데이터의 종류와 데이터를 맵핑시켜서 관리 : 데이터 갱신 작업하기가 편함
  • 관계형 데이터베이스 작업을 위한 언어 : SQL(어떤 테이블에 어떤 데이터에 어떤 작업을 할 것인지 나타낼 수 있음 - 표처럼 관리하고 있기때문에 딱 지칭하기가 좋음)
    • 모든 관계형데이터베이스마다 각각의 SQL 방언(dialect)이 있음 : 조금씩 다름 - JPA를 사용하면 사용하는 데이터베이스만 설정해두면 맞춰서 쿼리 생성함
    • 관계형데이터베이스 갱신 SQL : SELECT(검색), INSERT(등록), UPDATE(수정), DELETE(삭제)
SELECT 가져오고자하는컬럼명 FROM 테이블명 WHERE 조건;
SELECT name FROM address WHERE addr LIKE '%서울시';
  • 관계형데이터베이스(“R”DBMS)와 데이터베이스를 확실하게 구분해야함
    • 데이터베이스 : 데이터를 관리(갱신)하는 기능과 구조를 뜻하는 추상적인 개념임
    • 관계형데이터베이스: 추상적인 개념의 구현체(그런 기능을 구현했는데 관계형이라는 표로 데이터를 관리하도록 구현함) - DBMS의 한 종류

제품군

  • mysql
  • oracle
  • postgresql
  • db2