데브코스 W5D3

코끼릭·2022년 4월 13일
0

TIL

목록 보기
17/36

DAO(Data Access Object)

실제로 DB에 접근하는 객체로 SQL를 사용(개발자가 직접 코딩)하여 DB에 접근한 후 적절한 CRUD API를 제공한다.

DTO(Data Transfer Object)

레이어 간 데이터 교환에 사용하는 객체로 getter/setter 메서드만을 가지고 비즈니스 로직을 가지고 있지 않는 것이 특징으로 뷰 마다 필요한 도메인의 일부 속성만으로 DTO를 구성해서 전달할 수 있어 도메인의 구조에 의존성을 낮추는 효과를 한다.

@Getter
@AllArgsConstructor
public class VoucherDTO {
    private String id;
    private String type;
    private int amount;
}

VO

값을 가지는 객체를 의미해서 데이터에 대한 비즈니스 로직을 가질 수 있고 값 그 자체를 의미하는 객체이기 때문에 setter를 통해 값을 변경하는 것이 불가능하고 읽기 작업만 수행이 가능하다.

@Getter
public class Email {
    private final String address;

    public Email(String address) {
        Assert.notNull(address, "address should not be null");
        Assert.isTrue(address.length() > 4 && address.length() <= 30,"address length must be between 4 and 30 characters");
        Assert.isTrue(checkAddress(address), "Invalid email address");
        this.address = address;
    }

    private boolean checkAddress(String address) {
        return Pattern.matches("\\b[\\w\\.-]+@[\\w\\.-]+\\.\\w{2,4}\\b", address);
    }
	...
}

DataSource

JDBC의 일반화된 연결 팩토리로 프로퍼티 설정으로 url, driver, username, password 정보를 pom.xml로 설정하면 DB의 connection 정보를 담은 빈 객체을 Spring JDBC에게 주입 받을 수 있고 이를 통해 DB로 접근이 가능할 수 있게 해주는 인터페이스이다. DB connection pooling으로 일정량의 connection을 미리 생성시키고 프로그램의 요청이 있을 때마다 꺼내서 제공하기 때문에 속도와 퍼포먼스를 개선시킨 기능을 하고 있다.

HikariCP

JDBC의 대표적인 DBCP(DataBase Connection Pool)로 매우 가볍고 빠른 성능으로 많이 이용되고 있다.

Test Instance LifeCycle

Junit에서 제공되는 테스트 프레임워크는 디폴트로 하나의 메소드 안의 @Test를 수행할 때마다 새로운 인스턴스를 생성해서 해당 메소드를 실행하지만 아노테이션으로 해당 인스턴스 생성을 클래스 단위로만 변경하는 것도 가능하다.

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

+ Test일 때 ApplicationContext

테스트 수행에서 매번 ApplicationContext을 세팅하게 되면 성능적으로 상당히 비효율적이기 때문에 Spring Test에서는 여러 개의 클래스가 동일한 Config를 사용하면 하나의 ApplicationContext 인스턴스를 같이 사용할 수 있도록 해서 테스트 성능을 개선했다.

@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration
Class AppTest1 {
	@AutoWired
    ApplicationContext appicationContext;
    
}

...

@SpringJUnitConfig
Class AppTest2 {
	@AutoWired
    ApplicationContext appicationContext;
    
}

JDBC Template

일반 JDBC API를 사용할 경우 DB에 접근해서 값을 읽거나 수정, 삭제의 코드를 작성할 때 연결 생성과 명령문, 결과 파싱, 예외처리, 트랜잭션 처리 등 사용자가 반복적으로 작성해야 되는 코드가 많다. 그래서 이러한 번거로움을 개선해서 Spring에서 앞서 기술한 많은 코드를 대신할 수 있는 JDBCTemplate이라는 클래스를 제공하기 시작했고 사용자는 DataSource를 DI한 JDBCTemplate 객체를 사용해 SQL문만 작성해서 사용한다.

  @Configuration
  @ComponentScan(
      basePackages = {"default package name"}
  )
  class Config {
      @Bean
      public DataSource dataSource() {
          return new DataSourceBuilder.create()
                      .url()
                      .username()
                      .password()
                      .type()
                      .build();
      }

      @Bean
      public JdbcTemplate jdbcTemplate(DataSource dataSource) {
          //DB connection 팩토리를 의존한다.
          return new JdbcTemplate(dataSource);
      }
  }
  
  @Autowired
  JdbcTemplate jdbcTemplate;
  
  @Test
  public void testSQL() {
	//1. select
    jdbcTemplate.query('select * from table where name = ?', customMapper, params);
	//2. update
    jdbcTemplate.update('update table set name = ? where table', params);
    //3. insert
    jdbcTemplate.update('insert into table(name) values (?)', params);
    //4. delete
    jdbcTemplate.update('delete from table where name = ?', params);
  }

Jdbc API

MethodDescription
public int update(String query)insert, update, delete문을 실행할 때 사용한다.
public void execute(String query)DDL 문을 실행할 때 사용한다.
public T query(String sql, ResultSetExtractor rse)select 문에 대한 결과 record를 resultSet으로 fetch할 때 사용한다.
public List query(String sql, RowMapper rse)select 문에 대한 결과 record를 rowMapper로 fetch할 때 사용한다.

DAO
DataSource

profile
ㅇㅅㅇ

0개의 댓글