Lewis's Tech Keep
[OOP] 객체 지향적 개발을 원리로, Spring & JPA를 사용하면서 고민하는 것들 본문
서론
객체 지향적 및 테스트 코드 기반 개발을 시도 해 보자! 라는 목적으로 현재 진행하고 있는 사이드 프로젝트가 있다.
이를 적용하며 겪은, 아직 모자란 지식으로 겪는 이슈에 대해 적어보고 해결됐을 때의 방법 또한 양식이 되지 않을까 하여 기록한다.
본론
1. JPA를 사용하였을 때 불변성을 유지하기 힘든 점에 대한 고민
https://lewisseo91.tistory.com/156
나는 대체적으로 객체를 생성하는 시점에서 해당 객체에 대한 상태 및 필요한 값들이 완전하길 기대하는 개발 스타일이라고 생각한다. 이는 아마 POCU 아카데미에서 배웠던 개체 지향적 프로그래밍에 대한 영향이라고 생각하는데 객체(Object)를 생성한 순간에는 적당한 기본값을 넣고 나중에 주입하는 경우(ex. setter)에 일어나는 이슈에 대한 나의 주관적 생각은 이렇다.
- 의존성 방향 및 객체 오염에 대한 이슈
- 객체를 생성하는 곳 외에 외부에서도 해당 객체가 무엇을 하는 지 알게된다는 뜻이다. (캡슐화 깨짐)
객체의 외부에서 해당 객체가 어떤 역할을 하는 지 어느 정도 알고 그에 대한 행동을 메서드나 함수를 통해 전달하는 것인데 만드는 시점에서는 문제가 없는 것 처럼 보일 수 있다. 그러나 프로그램이 커지고 확장될 수록 이러한 코드의 히스토리에 기반하여 편승하는 경우가 점점 많아지게 된다.
이에 따라 어떤 객체가 하는 행동이 명확하게 정의가 되기 어려워진다. 객체 중심이 아닌 API에서 하는 기능 중심이 되어 코딩하게 되고 객체의 의존성 방향 및 결합도가 높아진다.
또한 경험적 지식을 토대로 느꼈던 점은 비즈니스적 요구사항은 빠르게 변하고 이런 캡슐화를 한번 깨는 코드가 들어오면 정말 몇 주안에 순식간에 객체가 A, B의 역할이 모호해지면서 Ab Ba 와 같은 느낌의 객체들이 무한 복사가 되는 것을 느꼈다. - 객체가 생성된 후에 주입하면서 상태나 값이 변하고 이는 동시성 프로그래밍 중요해지면 중요해질수록 오염의 위험을 그대로 노출하겠다는 의미가 된다.
외부에서 주입하면 주입할 수록 개인적으로 느꼈던 이슈들은 동시성 타이밍에 대한 이슈가 많아진다는 점이었다. 완전하지 않은 상태의 객체 A가 만들어진 후에 setter, update와 같은 메서드들로 업데이트 되는데 어떤 행동을 끝내기 전에 다른 행동을 하는 객체 B가 해당 행위를 이어받는 경우가 점점 더 자주 발생했다.
- 객체를 생성하는 곳 외에 외부에서도 해당 객체가 무엇을 하는 지 알게된다는 뜻이다. (캡슐화 깨짐)
2. hibernate 엔티티 생성 시 기본 생성자 필수관련 고민
hibernate에서 엔티티에 값을 넣기 위해 일단 빈 껍질을 생성해서 부른 다음에 setter 를 통해 값을 넣는 과정이 있기 때문에 빈 껍데기인 default constructor를 마구마구 넣어야 한다. 이 부분이 개인적으로는 꽤 스트레스인데 엔티티의 완전한 상태를 위해 final을 넣으면서 진행하였으나, 실제 동작에서는 완전한 상태가 아닌 객체를 만들고 나서 setter를 통해 값을 넣고 이를 운용하는 꼴이기 때문이다.
- 기본 생성자 필수 생성 이슈
- 완전한 상태가 아닌 빈 껍데기를 자꾸 만들어야 한다.
3. reactive한 프로그램을 설계하면서 맞이하는 기술적 의존에 대한 고민
spring 에서 webflux로 하면서 맞이했던 이슈였는데, non-blocking 하게 제대로 쓰기 위해서는 R2DBC 라이브러리 주입이 필요해지고 이에 따라 이를 제공받을 수 있는 RDB를 선택해야 한다.
- 링크에 제공되는 RDB 목록
- H2 (io.r2dbc:r2dbc-h2)
- MariaDB (org.mariadb:r2dbc-mariadb)
- Microsoft SQL Server (io.r2dbc:r2dbc-mssql)
- MySQL (dev.miku:r2dbc-mysql)
- jasync-sql MySQL (com.github.jasync-sql:jasync-r2dbc-mysql)
- Postgres (io.r2dbc:r2dbc-postgresql)
- Oracle (com.oracle.database.r2dbc:oracle-r2dbc)
대부분이 제공되어 많은 고민을 가져가지 않아도 되겠지만 개인적으로는 제공되는 목록이 이미 유한하다는 제한에 있어서 고민이 되는 것 같다.
- 2023.05.03