[우아한테크코스] 5월 31일 TIL

1 minute read

[Spring] dto 변환의 위치

  • dto 변환을 service에서
    controller는 presentation 계층이다.
    controller는 dto들만 알고 있다.
    controller에서 보낸 요청을 수행한 service는 dto로 변환하는 과정까지 거친다.
    이를 통해서 우리의 소중한 domain 로직에 대해서 숨길 수 있다.
    하지만 요청, 응답은 언제든 바뀔 수 있을텐데, controller가 아닌 service에서 변환 로직을 가지면 특정 controller에 service가 의존하게 되어 종속적이라는 단점이 존재한다.
    애초에 layered architecture가 나타난 이유가 계층간 종속성을 줄이기 위해서라는 관점에서 보면 이게 과연 옳은가? 라고 생각할 법 하다.

  • dto 변환을 controller에서
    controller가 우리의 소중한 도메인 로직까지 모두 알고 있다.
    기껏 캡슐화로 관리한 도메인 로직이 표현 계층까지 진출하는 것이 옳을까?
    controller에서 만들어낸 도메인 로직을 service에 전달하기 때문에 service는 비즈니스 로직을 수행하는 책임만 담당하면 된다.
    단 이경우, dto와 도메인이 1:1로 매핑되어야할 것 같다는 샌각이 든다.

[Spring] SimpleJdbcInsert

기존 jdbc로 삽입하고 auto increment를 가져오려면 keyHolder의 사용이 필요했다.
spring에서 제공하는 SimpleJdbcInsert를 사용하면 리턴 값으로 id를 준다.

    private final JdbcTemplate jdbcTemplate;
    private final SimpleJdbcInsert simpleJdbcInsert;

    public SectionDao(JdbcTemplate jdbcTemplate, DataSource dataSource) {
        this.jdbcTemplate = jdbcTemplate;
        this.simpleJdbcInsert = new SimpleJdbcInsert(dataSource)
            .withTableName("SECTION")
            .usingGeneratedKeyColumns("id");
    }

SimpleJdbcInsert로 주입 받고 Long lineId = insertAction.executeAndReturnKey(params).longValue();로 사용할 수 있다.

이와 유사하게 urd도 NamedParameterJdbcTemplate, BeanPropertySqlParameterSource과 같이 간단히 해주는 클래스들이 있다.

[Spring] API 문서 자동화 하기

  • Swagger로 자동화하기
    1. build.gradle에 의존성 추가
      ``` compile group: ‘io.springfox’, name: ‘springfox-swagger2’, version: ‘3.0.0’ compile group: ‘io.springfox’, name: ‘springfox-swagger-ui’, version: ‘3.0.0’

    implementation “io.springfox:springfox-boot-starter:3.0.0”

      2. 프로젝트에 Swagger 설정 Bean 등록  
      SwaggerConfig.java 생성  
      ```java
      @Configuration
      @EnableSwagger2
      public class SwaggerConfig {
          @Bean
          public Docket api() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .select()
                      .apis(RequestHandlerSelectors.any()) // 현재 RequestMapping으로 할당된 모든 URL 리스트를 추출
                      .paths(PathSelectors.ant("/api/**")) // 그중 /api/** 인 URL들만 필터링
                      .build();
          }
      }
    

    설정 파일의 조작으로 원하는 것을 다양하게 얻어낼 수 있다.
    안될 경우 여기서 swagger 문법에 문제 없는지 확인

    1. localhost:8080/swagger-ui/에 접속해서 확인
      인터셉터에 걸려서 안나올 경우 .excludePathPatterns("/v2/api-docs", "/swagger-resources/**", "/swagger-ui.html", "/webjars/**")로 해결
  • Spring Rest Docs 적용
    제품 코드에 영향이 없다. 테스트가 성공해야 문서가 작성된다.
    참고