DAO, DBConntion, Service 기능을 JDBC로 구현하는 작업을 진행하였다.
기존에는 Connection이 싱글톤으로 관리되고 있었다.
또한, DAO가 각자 Connection을 멤버로 가지고 있고, 이를 통해 DB I/O를 실행했다.
하지만 위의 방식은 Connection이 싱글톤으로 관리되기 때문에 멀티스레드 환경에서 동작하지 않는다.
하나의 스레드가 Connection을 가지고 종료될 때까지 반환하지 않기 때문이다.
따라서 멀티스레드 환경을 고려해 DB Connection Pool Manager를 구현하였다.
이는 DB Connection Pool을 관리하며 Connection을 생성하고 반환하는 기능을 가진다.
이제 DAO와 Service는 싱글톤으로 관리되는 것이 더 적절해졌다.
DAO는 더이상 Connection을 상태로 가질 수 없다. 모든 메서드에서 Connection을 인자로 받아 요청된 작업을 수행하도록 변경하였다.
Service도 굳이 여러 인스턴스가 생성될 필요가 없다.
DAO와 마찬가지로 싱글톤으로 관리되게끔 변경하였다.
여기서 의문이 생겼다.
DAO와 Service가 Static 유틸클래스와 매우 유사해졌다는 것이다.
스프링은 이러한 클래스를 왜 static이 아닌 싱글톤으로 관리할까?
싱글톤과 Static의 차이를 먼저 알아보고자 한다.
간단하게 객체지향적으로 구분하자면
싱글톤은 애플리케이션에서 하나의 인스턴스를 생성한다. 또한 상태를 가질 수 있다.
하지만 static은 인스턴스를 생성하지 않으며 상태를 가질 수 없다.
1. 저장영역
싱글톤은 인스턴스를 생성하기에 힙에 저장된다.
Static은 staticArea에 저장된다.
2. 다형성, 인터페이스
싱글톤은 다형성과 인터페이스를 생성할 수 있다.
Static은 불가능하다.
싱글톤이 static보다 좀 더 객체지향적인 느낌이 든다.
Service는 DAO라는 멤버를 가지기 때문에 싱글톤으로 관리된다고 치고
DAO는 왜 static이 아닌걸까, Connection을 모든 메서드에서 받기 때문에 멤버를 가지지도 않는데,,
아래의 포스팅에서는 큰 차이가 없다고 한다.
결론
내가 직접 사용해보고 효율적이라고 생각하는 방식으로 구현하는 게 맞는 거 같다.
'의문과 실험' 카테고리의 다른 글
[Spring] JPA 엔티티에는 접근자 메서드외의 다른 메서드가 선언되어도 되는가 (0) | 2023.08.15 |
---|---|
Model이 DTO의 존재를 모르게 하라? Model과 DTO (0) | 2023.07.11 |
[JAVA] Vector는 Thread-Safe 한가? (0) | 2023.04.21 |
[JAVA] 자바는 Call by Reference 지원 안해. 참조변수를 넘기는 경우는 뭘까? (0) | 2023.04.04 |
[JAVA] 오라클 공식 문서에도 없는 String pool은 도대체 무엇인가? (0) | 2023.04.03 |