2022-04-13 TIL

이창호·2022년 4월 13일
0

프로그래머스 백엔드 데브코스 23일차

Spring boot part2

JDBC

객체를 생성 할 때 검증하기

public class Customer {
	...
	public Customer(...) {
        validate(...);
        ...
    }
    
	private void validate(...) {
        ...
    }
}

DataSource로 DB연결 Test하기

테스트코드에서 Configuration을 한 다음 @Autowired로 의존 객체를 주입한다.

    @Configuration
    @ComponentScan(basePackages = {"org.prgrms.kdt.customer"})
    static class Config {
        @Bean
        public DataSource dataSource() {
            var dataSource = DataSourceBuilder.create()
                    .url(...)
                    .username(...)
                    .password(...)
                    .type(HikariDataSource.class)
                    .build();
			// thread_connected, thread_created 수 늘려보기
            dataSource.setMaximumPoolSize(1000);
            dataSource.setMinimumIdle(100);
            return dataSource;
        }
    }
    
	@Autowired
    TestRepository testRepository;

    @Autowired
    DataSource dataSource;
    
	@Test
    @DisplayName(...)
    public void test() {
        var test = testRepository.test();
        assertThat(test, is(false));
    }

Test 할 때, 전처리 과정 추가 및 순서 설정

@BeforAll을 사용하면 테스트 시작전에 해당 method를 사용 할 수 있다.
@TestInstance를 사용하면 @BeforAll이 있는 method를 static없이 사용 할 수 있다.
@Order(...)과 @TestMethodOrder를 사용하면 @Order 순서대로 테스트가 실행된다.

@SpringJUnitConfig
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class Test {
	@BeforeAll
    void setup(){ ... }
    
    @Test
    @Order(1)
    void test1{ ... }
    
    @Test
    @Order(2)
    void test1{ ... }
}

JDBCTEMPLATE을 사용하여 간단하게 만들기

아래와 같이 datasource를 만든 후, jdbctemplate를 만들면 준비는 끝난다.
connection을 열고 statement를 생성 후 resultset을 만드는 과정을 jdbctemplate이 대신 해준다.

	HikariDataSource dataSource = DataSourceBuilder.create()
		.url("jdbc:mysql://localhost/order_mgmt")
		.username("root")
		.password("1234")
		.type(HikariDataSource.class)
		.build();
        
	JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    
    // for upgrade uuid version3 to version4
    static UUID toUUID(byte[] bytes) {
        var byteBuffer = ByteBuffer.wrap(bytes);
        return new UUID(byteBuffer.getLong(), byteBuffer.getLong());
    }
    
    // insert
    public Tester insert(Tester tester) {
        var executeUpdate = jdbcTemplate.update("INSERT INTO tester(id, name, email, created_at) VALUES (UUID_TO_BIN(?), ?, ?, ?)",
                tester.getId().toString().getBytes(),
                tester.getName(),
                tester.getEmail(),
                Timestamp.valueOf(tester.getCreatedAt())
        );
        if (executeUpdate != 1) {
            throw new RuntimeException("Nothing was inserted");
        }
        return tester;
    }
        
	// rowmapper for get query result
	RowMapper<Tester> testerRowMapper = (resultSet, i) -> {
        var id = toUUID(resultSet.getBytes("id"));
        var name = resultSet.getString("name");
        var email = resultSet.getString("email");
        var lastLoginAt = resultSet.getTimestamp("last_login_at") != null ?
                resultSet.getTimestamp("last_login_at").toLocalDateTime() : null;
        var createdAt = resultSet.getTimestamp(
                "created_at").toLocalDateTime();
        return new Tester(id, name, email, lastLoginAt, createdAt);
    };
        
	// select all
    public List<Tester> findAll() {
        return jdbcTemplate.query("select * from testers", testerRowMapper);
    }
    
    // find by id
    public Optional<Tester> findById(UUID id) {
        try {
            return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM testers WHERE id = UUID_TO_BIN(?)",
                    testersRowMapper, id.toString()));
        } catch (EmptyResultDataAccessException e) {
            return Optional.empty();
        }
    }
profile
이타적인 기회주의자

0개의 댓글