본문 바로가기
Spring 프레임워크/예제

"비즈니스 레이어 (서비스 레이어) 를 사용 하기" 예제

by Hwanii_ 2023. 8. 8.
728x90

1.

서버에서 DBMS (DataBase Management System) 변경이 자주 발생 한다.

 

즉, DAO 변경이 자주 발생 하게 된다는 의미 이다.

 

DAO 이란 ?

Data Access Object 을 의미하며,

데이터베이스나 다른 영구한 저장소에 접근하여 데이터를 조작하는 역할을 담당 한다.

데이터베이스와의 상호작용 즉, CRUD 작업을 처리 한다.

 

암튼 이렇게 변경이 자주 발생 하는 DAO 를 직접 사용 하면,

결합도가 높아져서 코드의 유지 보수에 불리해짐을 의미 한다.

 

>>

무언가 객체를 직업 사용 한다 == 결합도 증가 == 유지 보수 불리

 

2.

Service 를 통해 DAO를 간접 사용 하여 결합도 낮추기

(== 유지 보수 용이)

 

XxxController.java 내부의 메서드 에서 사용 하고 있는 모든 DAO 를 제거 한다.

 

그러면, Command  객체 개념을 사용 하고 있었던, 메서드의 인자인 DAO도 모두 제거 한다.

 

그리고 나서 DAO "대신 사용할" 특정한 Service를 멤버변수로 추가 한다.

 

Service를 멤버변수로 추가 했다 ?

== XxxController.java 와 XxxService xxxService는 의존 관계 !

== 의존 주입 필요 !

== @Autowired 어노테이션 작성 !

 

Service 레이어란 ?

비즈니스 로직을 처리하고 관리한다.

비즈니스 로직을 더욱 추상화 하고 관리하기 위해 사용 한다.

Service 레이어는 비즈니스 로직을 직접적으로 다루며,

DAO 와의 인터페이스 역할을 수행 한다.

 

레이어 개념 링크 :

 

https://hwanii96.tistory.com/329

 

레이어 개념 정리

[ 결론 ] 비즈니스 로직 & 서비스 계층은 applicationContext.xml 에서 객체화 설정 작업을 한다. 즉, DAO, Service 류의 객체화는 applicationContext.xml 에서 작업 한다. 이때, DAO, Service 류는 서버가 시작할 때 "

hwanii96.tistory.com

 

3.

아래의 예제 코드를 확인 하기.

 

 

위의 이미지는, BoardService 인터페이스 이다.

 

아래는 BoardService 인터페이스를 구현한 BoardServiceImpl 클래스 이다.

 

 

BoardService 인터페이스를 구현한 BoardServiceImpl 자료형이 (클래스)

boardService 라는 참조변수로 객체화를 할 수 있게 하는 @Service 어노테이션 이다.

 

 

BoardServiceImpl 클래스 내부의 CRUD 메서드를 사용 하기 위해서는,

BoardServiceImpl 자료형이 객체화가 되어 있어야 하고,

@service("boardService") 어노테이션으로 객체화를 할 수 있게 명시했으니,

참조변수 boardService로 위의 CRUD 메서드를 사용 할 수 있게 된다.

 

그리고,

위의 CRUD 메서드는 return 반환값으로,

boardDAO 참조변수를 사용한 각 CRUD 메서드 이다.

 

결국,

참조변수 boardService로 각 CRUD 메서드를 호출 하면,

반환값으로

각 CRUD 메서드를 실행한 결과값을 반환 하게 된다.

 

return boardDAO 참조변수.insert();

return boardDAO 참조변수.selectAll();

return boardDAO 참조변수.selectOne();

return boardDAO 참조변수.update();

return boardDAO 참조변수.delete();

 

각 CRUD 메서드를 사용 하고 있는 XxxController.java를 확인 해보자.

 

 

DeleteBoardController 클래스 내부에

BoardService boardService 멤버 변수가 선언 되어 있으며,

이는 의존 관계 이므로, 의존 주입을 위해서,

@Autowired 어노테이션을 명시해준다.

 

이미,

BoardServiceImpl 클래스 에서 Service("boardService") 어노테이션으로

객체화가 되어 있기 때문에,

즉,

메모리에 boardService 참조변수가 객체화 되서 올라와 있기 때문에,

@Autowired 어노테이션을 사용 해서 의존주입이 가능하게 된다.

 

BoardService boardService 멤버 변수는 인터페이스의 다형성이 실현 되어 있으며,

 

메서드의 인자로 DAO가 사라져 있으며,

메서드 내부의 DAO 객체를 직접 사용 하는 모습이 사라진 것을 확인 할 수 있다.

 

 

DetailBoardController 클래스 내부 에서도, BoardDAO bDAO 객체는 보이지 않으며,

 

모두,

BoardService 인터페이스를 구현한 BoardServiceImpl 자료형의 참조변수 boardService를 사용하여,

필요한  CRUD 메서드를 사용 하는 모습을 확인 할 수 있다.

 

 

 

BoardService 뿐만 아니라, MemberService 도 마찬가지이다.

 

 

 

만약, DAO가 변경되서 유지보수가 필요 하면 어떻게 할 수 있을까 ?

 

MemberDAO 클래스명이 다른것으로 바뀌였다면 ?

 

예를 들어 MemberDAO2 클래스로 변경된다면 ?

 

 

14번째 라인의 멤버변수로 선언되어 있는 클래스명만 수정 하면 된다.

 

유지 보수가 엄청 용이해진다.

 

이러한 서비스 레이어  개념을 사용 하지 않는다면,

XxxController.java 내부에서 사용되는 MemberDAO 타입의 mDAO가 있다고 가정했을 때,

MemberDAO가 MemberDAO2 로 변경 됬다고 한다면,

모두 수정해 줘야 하는 번거로움이 발생 하게 된다.

이는 유지 보수가 불리한것을 의미 한다.

 

예시)

 

 

 

 

 

[ 참고 ]

 

XxxController.java 내부에 선언되어 의존 주입 되어 있는 멤버변수인,

BoardService boardService 하고,

MemberService memberService 는,

이 각각 참조변수를 사용해서 CRUD 메서드를 호출 하기에,

각각의 XxxController.java 내부의 메서드를 모두

한곳의 Controller.java 에 몰아 넣어도 된다.

 

예시)

 

BoardController.java 에 boardService 참조변수를 사용해서,

CRUD 메서드를 호출 하는 모든 메서드를 몰아 넣기.

 

MemberController.java 에 memberService 참조변수를 사용해서,

CRUD 메서드를 호출 하는 모든 메서드를 몰아 넣기.

 

(근데, 이 방법이 좋은건지..? 모르겠음)

반응형