![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/wYobX/btspmMb8J9j/09YwAXeCsn8dZht7a7f9u1/img.png)
최근의 프로젝트에서 Spring Data JPA를 통해 상속관계를 사용했으나 적절하지 않음을 깨닫고 언제 슈퍼/서브타입을 사용해야 할지 정리하는 글입니다. 확장(Enhanced, Extended) ER과 슈퍼/서브타입 RDB의 엔티티 릴레이션(ER), 테이블은 정보를 저장하는 기본 단위이다. 전통적인 릴레이션 모델링만으로는 현실의 다양한 데이터들을 효율적으로 나타내기 어려워 이를 조금 더 추상화한 확장 ER의 개념이 나오게 되었고 데이터의 상속 관계를 나타내기 위한 슈퍼/서브타입에 대한 개념이 여기에 포함된다. (명칭은 Super class & Subclass라 부르기도 하나 여기서는 슈퍼/서브타입 관계라 칭한다) 전통적인 모델링에서는 어떤 테이블의 하나의 열에 저장된 외래 키를 통해 다른 하나의 테이블..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/Nkw0I/btsnEM0qPbZ/oQBmPTd98QPCRCvnQP1Pa1/img.png)
언제 JSON으로 데이터를 말아서 저장하면 좋은가? 저장될 데이터 구조의 변동성이 낮다면 일반적인 자료형으로 데이터를 저장하는 것이 바람직하다. 하지만 RDB를 사용하며, 데이터가 1. 비정형 데이터이거나 2. Key-Value 형태로의 저장이 적절하며 3. JSON으로 묶인 데이터의 세부 내용을 각각 참조할 상황이 적다면 NoSQL을 사용하지 않는 경우에도 해당 데이터를 JSON으로 저장하는 것이 적절할 수 있다. JSON 사용을 위한 Hypersistence-utils 의존성 추가하기 JPA에서 JSON 형태의 자료를 DB Column에 삽입하기 위해서는 별도의 의존성이 필요하다. 다음에 설명할 기술은 JPA의 구현체인 hibernate에만 부가적으로 사용 가능한 기능이므로 hibernate를 사용하..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/IIb26/btslRm94lqz/YbvSRT7Dvfr0YBJOlzNT0K/img.png)
GitHub의 Issue와 같은 기능에 템플릿을 적용하는 기능은 전부터 가능했었지만 Discussion에 템플릿을 적용하는 기능은 비교적 최신(2023.01)에 추가되었다. 간단히 GitHub Discussion을 활성화, 템플릿을 만들고 적용하는 과정을 소개하려 한다. GitHub Discussion 활성화하기 저장소의 Private, Public 여부와 관계없이 Discussion 기능을 사용할 순 있지만 별도의 활성화 과정이 필요하다. 저장소, 혹은 조직의 Settings 탭을 한참 내리면 Discussion을 활성화하는 창이 보인다. 체크박스를 클릭해 활성화하자. 아래와 같이 Discussions 탭이 새로 생성된 것을 확인할 수 있다. 기본 제공되는 카테고리 기본 제공되는 카테고리와 템플릿이 있..
최근 ORM 없이 순수 JDBC + Spring, 그리고 JDBC template을 통한 SQL mapper + Spring 조합의 웹앱들을 만들어보았다. Presentation, Service, Persistence 세 레이어를 ATDD 스타일로 구현하며 단위 테스트와 통합 테스트를 다양하게 작성해보았고, 괜찮았던 방법과 고민했던 포인트들을 적어보려고 한다. 각 레이어에 대한 단위 테스트는 Mockito를 통한 Slice 테스트로 Out - In 방식의 TDD에 용이한 Mockito Persistence -> Service -> Presentation 순서로의 In-Out 방식의 개발을 진행하면 상위 레이어를 구현할 때 하위 레이어가 이미 모두 구현되있으므로 하위 레이어를 포함한 단위 테스트를 구현할 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/uyual/btshzBDRzyV/cEoufoLKYz66pGKUycVOQ1/img.png)
스프링의 컨트롤러 메서드는 크게 데이터를 반환하는 RestController와 뷰를 반환하는 일반적인 Controller로 나뉜다. RestController의 반환 값은 HttpMessageConverter에 의해 json과 같은 형식으로 변환되어 전달되고, Controller의 반환 값은 뷰의 이름으로 간주되어 ViewResolver가 서버 내의 적절한 뷰 파일을 찾아 처리한다. 초기화 ViewResolver를 호출하고 사용하는 클래스는 DispatcherServlet이므로, DispatcherServlet에 대해 간단히 알아야 한다. ApplicationContext가 초기화된 후에 DispatcherServlet 또한 초기화되는데, 이때 사용될 ViewResolver를 모두 찾아 리스트로 가져온다..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/lLPwe/btshy8OkyFt/ELkyEoXcw7LTKF59fZucnk/img.png)
Interceptor에서 로그 생성, yml 파일로 별도 저장 설정하기 스프링에서 요청과 응답이 어떻게 처리되었는지 간단하게 기록을 남기고 싶었다. AOP를 사용할 수도 있지만 나는 Interceptor의 preHandle()과 postHandle()를 통해 로그를 남기는 방법을 선택했다. 아래와 같이 interceptor를 만들고 @Configuration이 붙은 파일에서 Interceptor를 추가하였다. public class LoggingInterceptor implements HandlerInterceptor { private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); @Override publi..
- Total
- Today
- Yesterday
- MySQL 이벤트 스케줄
- 생성자 주입
- thenComparing
- Jenkins 예약 배포
- 우테코 프리코스
- Spring
- GitHub Discussion
- springboottest
- GitHub Discussion Template
- GitHub Discussion 템플릿
- 우테코 5기
- Spring 테스트
- Payload 암호화
- comparing
- JPA JSON
- RandomPort
- logback-spring.xml
- 스프링
- JPA
- 자바
- 람다식
- 함수형 인터페이스
- 우테코
- Fromtail
- 의존성 주입
- invokedynamic
- stubbing
- Java
- java switch case
- Spring Boot Monitoring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |