[58일차] 기술면접

유태형·2022년 7월 20일
0

코드스테이츠

목록 보기
58/77

오늘의 할일

  1. DTO클래스의 RequestBody에 대한 유효성 검증
  2. ORM
  3. 트랜잭션



내용

DTO클래스의 RequestBody에 대한 유효성 검증

  1. 우선 DTO 클래스를 왜 사용하는지 부터 정리할 필요가 있습니다. DTO클래스는 두가지의 역할을 수행합니다. 첫번째로 Spring내의 API계층과 서비스 계층간의 분리를 위해 API계층에서만 사용되도록 하는 데이터를 가진 클래스입니다. 두번째로 클라이언트의 requestBody로 부터 오는 프로퍼티나 파라미터를 일일이 매개변수로 지정하는 것이 아니라 객체 하나로 통틀어서 받기 위함입니다. 유효성 검증은 두번째의 목적에서 클라이트가 전송하는 데이터가 서버에서 처리하기 적합한 타입 또는 값을 가진 데이터인지 구분하는 것을 의미합니다.
  2. 유효성 검증을 진행하는데에 있어 만약 Controller에서 검사를 하게 된다면 Controller에서의 기능을 수행하는 코드와 더불어 유효성 검증을 진행하는 코드들이 뒤섞여 중구 난방인 코드가 될것입니다. 반면 DTO클래스는 단순히 필드, 생성자, getter, setter로만 이루어 져 있으므로 유효성 검증을 하는 에너테이션과 코드가 추가되어도 목적이나 가독성상 문제가 없습니다. 유효성 검증은 Controller가 아닌 DTO 클래스에서 하게 됩니다.
  3. DTO 유효성 검증은 필드에 에너테이션을 추가하면서 검증이 가능합니다. 기본적으로 제공하는 @Email, @Size, @Positive, @Negative, @Max, @Min, @NotNull, @NotEmpty, @NotBlank등 스프링은 다양한 조건들이 있는 유효성 검증 에너테이션을 기본적으로 제공합니다. 또한 개발자가 임의로 @Pattern의 regexp 애트리뷰트에 정규표현식으로 조건을 정의할 수도 있습니다. 또한 유효성 검증 애너테이션 모두 message 에너테이션을 이용하여 유효성 위반시 에러메세지를 표현할 수 있습니다.
  4. Controller에서는 헨들러 메서드에서 @ReqeustBody에너테이션으로 받는 DTO클래스 앞에 @Valid에너테이션만 붙혀준다면 DTO클래스에서 검증을 실행할 수 있습니다.



ORM

  1. ORM은 객체지향 프로그래밍 언어인 Java와 관계지향 데이터베이스간의 매핑을 위한 기술입니다. 가장 흔히 사용되는 외부 라이브러리로는 Spring JDBC, Spring JPA, Spring Data JDBC, Spring Data JPA등이 존재합니다.
  2. ORM이 매핑되는 기준은 자바와 데이터베이스간 1:1로 치환이 가능한데, 클래스의 경우 테이블로, 객체의 경우 레코드, 필드는 속성, 필드 데이터는 속성 데이터로 전환되어 데이터베이스에 저장됩니다.
  3. ORM을 사용하게 된다면 스프링은 객체를 기반으로 SQL문을 자동으로 생성해줍니다. 개발자는 SQL문보다 객체에 좀더 집중하게 되므로 데이터베이스보다 비즈니스 로직에 좀더 집중할 수 있게 되고, 또 어느 데이터베이스인지 상관없이 객체를 레코드로 변환시켜 주니 DBMS에 대한 종속성도 사라지게 됩니다. 하지만 ORM만으로는 모든 상황을 대처하기엔 무리가 있으므로 필요시 @Query에너테이션을 이용하여 쿼리문을 직접 작성할 수도 있습니다.



트랜잭션

  1. 트랜잭션은 여러개의 작업을 하나의 단위로 묶는 과정입니다. 하나의 단위에 속한 여러개의 작업들은 모두 성공하던가, 하나라도 실패해서 모두 실패하던가 하는 All or Nothing 규칙을 따르게 되는데, 이와같이 100% 성공해야지만 데이터베이스에 반영되므로 하나라도 하나의 실패도 없이 모두 성공되어 왔다는 무결성을 보장할 수 있습니다.
  2. 트랜잭션의 원리에는 ACID가 존재하는데 간략히 설명드리겠습니다. A 는 원자성으로 모두 성공하든가 모두 실패해서 더이상 쪼개지지 않게 하는 것입니다. C 는 일관성으로 비즈니스 로직의 데이터 값과 데이터베이스에 저장되는 데이터 값이 일치해야 합니다. I는 격리성으로 트랜잭션간에는 독립적으로 실행되어야 합니다. D는 지속성으로 저장된 데이터베이스는 반 영구적으로 유지되어야 합니다.
  3. Spring에서의 트랜잭션은 @Transactional 에너테이션으로 구현할수도 있고, AOP를 이용하여 구현할 수도 있으나 보통 @Transactional 애너테이션을 많이 사용합니다. 서비스에서 클래스에 @Transactional을 적용하면 클래스 내의 모든 메서드가 각각 트랜잭션을 가지고, 메서드에 @Transactional을 적용하면 해당 메서드만 트랜잭션을 가집니다. 또 트랜잭션은 여러 옵션을 가질 수 있습니다.
  4. 트랜잭션의 범위와 격리성을 지정할 수도 있습니다. 대표적은 애트리뷰트로 Propagation은 트랜잭션의 범위를 지정하고 isolation은 타 트랜잭션과의 격리성을 지정합니다. 트랜잭션 마다 다른 범위와 격리성을 가질 수 있고 클래스와 메서드에서 각각 @Transactional로 트랜잭션을 설정할 수 있으므로 메서드의 것이 클래스의 것보다 높은 우선순위를 가지게 됩니다.



후기

기술 면접준비는 언제나 어렵다!




GitHub

없음!

profile
오늘도 내일도 화이팅!

0개의 댓글