SQL 첫걸음
패턴매칭에 의한 검색(82p)
LIKE를 사용해서 문자열의 일부분을 비교하는 부분검색을 할 수 있다.
SELECT * FROM sample25 WHERE text LIKE '%SQL%';
문자열 중간에 존재하는 SQL을 찾을 때 앞뒤로 %를 붙인다.
전방일치는 'SQL%'
후방일치는 '%SQL'
이번 프로젝트에서 아쉬웠던 상황
pr 보내고 피드백 받은 사항을 수정하는데 API의 구조가 변경되었다.
iOS분들에게 이 내용을 협의하지 않고 진행한거라서 마음대로 변경한 상황이 되어버렸다.
특히 데모가 다가오는 시점에서 이런일이 발생해서 iOS분들이 당황하셨을텐데 화도 안내시고 이해해주셔서 감사했다.
앞으로 이런 부분도 더 신경써서 변경하고 미리 상의해야되겠다고 깨닫게 된 경험이였다.
(ResposeEntity를 바로 리턴하도록 구현한 것에서 ResponseBody 로 변경했었다.)
JK 말씀
현업에서는 사용자들이 구버전의 앱을 이용하는 경우가 있으므로 백엔드는 구버전의 API와 새로운 버전의 API를 다 배포해야한다.
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
스프링부트 환경에서 테스트를 실행하려니 이런 에러가 나온다.
@SpringBootApplication 어노테이션이 붙은 클래스가 존재하는 패키지의 하위 패키지에 테스트를 둬야하는데 그렇지 않았을 경우 발생하는 에러이다.
참고 자료: https://jjunii486.tistory.com/172
introducing-spring-data-jdbc 예제 실습
실습하면서 나온 설명들을 정리해보았다. (틀린 부분 지적은 감사히 받겠습니다.)
@Configuration
@EnableJdbcRepositories
public class CustomerConfig extends AbstractJdbcConfiguration {
@Bean
NamedParameterJdbcOperations operations() {
return new NamedParameterJdbcTemplate(dataSource());
}
@Bean
PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(EmbeddedDatabaseType.HSQL)
.addScript("create-customer-schema.sql")
.build();
}
}
JdbcConfiguration deprecated
JdbcConfiguration이 deprecated 되었다고 하여 검색해보니,
JdbcConfiguration
has been deprecated and recommended to use AbstractJdbcConfiguration
AbstractJdbcConfiguration을 대신 쓰면 될듯하다.
@Configuration(기본 환경 구성)
외부 라이브러리, 또는 설정 클래스를 Bean으로 등록할때 @Bean 어노테이션 사용
하나 이상의 @Bean 이 있는 클래스에서 @Configuration 어노테이션을 달아준다.
@EnableJdbcRepositories
repository를 만들수 있게 하는 어노테이션
이 어노테이션이 있으면 Bean들이 존재해야하므로, Bean을 추가함으로서 설정을 추가해줘야한다.
Extending JdbcConfiguration(여기선 AbstractJdbcConfiguration)
기본 빈들(some default beans)을 ApplicationContext에 추가한다.
AbstractJdbcConfiguration의 메소드들을 오버라이딩해서 Spring Data JDBC 동작을 원하는대로 바꿀 수 있다.
NamedParameterJdbcOperations
내부적으로 SQL문을 데이터베이스로 전송하는 역할을 한다.
Transaction manager
여기선 PlatformTransactionManager 사용
트랜잭션을 관리할수 있게 해주는것
DataSource
Spring Data JDBC가 직접적으로 사용하는 것은 아니다.
하지만, TransactionManager와 NamedParameterJdbcPoerations 가 같은 DataSource 인스턴스를 사용하는 것을 확실히 하기 위해서 DataSource를 빈으로 등록하는 것이 좋다.
테스트 진행할때 repository.save()에서 NullPointerException 발생
customerRepository.save()할때 NullPointerException이 뜨는 경우에는 customerRepository에 대한 의존성 주입이 제대로 되지 않아서 repository가 null인 경우 발생한다.
검색한 자료대로 @SpringBootTest를 붙이면 다른 에러가 뜬다.
미해결.. 일단 튜토리얼을 따라한것에 의의를 두고 넘어가자
참고 : https://github.com/ddd-by-examples/library/issues/11 (JdbcConfiguration deprecated)
https://mangkyu.tistory.com/75 (@Configuration)
http://tech.javacafe.io/spring/2018/11/04/%EC%8A%A4%ED%94%84%EB%A7%81-Configuration-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%98%88%EC%A0%9C/ (@Configuration)
https://n1tjrgns.tistory.com/224 (repository.save() 시 NullPointerException 발생)
https://www.javaer101.com/ko/article/2759553.html (repository.save() 시 NullPointerException 발생)
Spring Data JDBC에 대한 자료들을 보며 예제를 따라쳐보았는데 어떤 문제인지는 정확히 모르겠지만(아마도 DB연결을 제대로 안해줘서 그런거 같기도..) 테스트코드가 자꾸 실패한다. 여러 에러들을 찾아보며 해결해나갔지만 계속 새로운 에러들이 나타나서 결론적으로 해결하지 못했다.
내일은 루카스에 있는 자료를 보고 튜토리얼을 따라해봐야겠다.
항상 잘보고 있어요 ~~
그런데 에러코드도 기록하는 습관을 남기면 어떨까요!