어떤 클래스가 무슨일을하는지, 흐름과 구조를 여러분이 알고있어야 한다.
객체지향 프로그래밍을 잘짜는 방법이고 실력을 향상시키는 방법
파일업로드 처리기법 apache common 라이브러리 또는 서블릿에서 제공해주는 API를 사용하는방법.
게시글 등록록과 관련된 participants(참여자들)
1. 게시글 등록 요청이 들어온다 --->
BoardAddController(서블릿)가 받는다.
2.생성 - Board객체를 생성한다. Board객체에는 게시글의 작성자(Member)를 포함하며, 첨부파일(AttachedFile)을 포함한다.
3. insert(Board) - BoardDao(모델)를 생성(사용)
4. insert를 실행한다.
- insert가 들어오면 BoardDao는 데이터베이스 테이블에서 app_board(데이터베이스테이블)
- insert:게시글의 제목, 내용 boardDao -> app_board
5. insert를 실행한다.
- app_board는 app_board_file에 대해서 insert한다.
- inser:게시글의 첨부파일 boardDao -> app_board_file
6. BoardDao -> BoardAddController로 리턴
7. BoardAddConroller -> 클라이언트로 응답(redirect)
insert() 메서드는 게시글 입력과 첨부파일 입력을 모두 처리한다.
=> 여기서 문제가 발생하는데, 첨부파일을 다루지 않을경우는 어떻게하나?
=> 만약, 다른 프로젝트에서 첨부파일을 다루지 않을경우는 어떻게 하나?
=> DAO 클래스를 변경해야한다...
문제점:
- 업무 로직이 변경되면 DAO 코드를 변경해야 한다.
=> 재사용성이 떨어진다.
: 업무로직이 변경 -> 고객사 마다 업무처리 방식이 조금씩 다르다
해결책:
- DAO에서 업루로직을 분리
BoardDap
app_board
app_board_file
BoardAddController
- 요청 파라미터값 가공
- 응답 처리
- 비즈니스로직 수행
BoardDao
- 데이터 처리
- 비즈니스 로직 수행 X -> Controller로 이관함.
=> DAO를 좀더 재사용하기 좋게 만든다.
3. insert(Board객체) : BoardDaoController -> BoardDao
- 게시글 입력만 처리
4. insert : BoardDao -> app_board
- 게시글의 제목 내용
5. insertFiles() : BoardAddController -> BoardDao
- 입력 흐름을 DAO가 아닌 Controller에서 결정한다.
- 첨부파일 입력만 처리
6. insert : BoardDao -> app_board_file
- 첨부파일
문제점:
- Controller가 너무 많은 일을 한다.
요청 파라미터값 가공하고 응답처리도하고 비즈니스 로직도 수행한다.
즉, Controller가 너무 많은 일을 한다. 가능하면 응집력을 높여라
한클래스가 하나의 역하을 할 수 있도록, 여러역할을 한다면 좀더 적게해라
=> "High Coheion"
비즈니스로직을 분리
=> 별도 클래스로 정의
'별도 클래스' : 서비스 컴포넌트
BoardAddController
- 요청 파라미터값 제공
- 응답처리
<<서비스 컴포넌트>>
BoardService
- 비즈니스 로직 수행
<<Model>>
BoardDao
- 데이터 처리
2. insert(Board) : <<Controller>>BoardAddController -> <<Model>>BoradService
3. insert() : <<Model>>BoardService -> <<Model>>BoardDao
4. insert : <<Model>>BoardDao -> <<table>>app_board
- insert: 게시글의 제목, 내용
5. insertFIles() : <<Model>>BoardService -> <<Model>>BoardDao
6. insert : <<Model>>BoardDao -> <<table>>app_board_file
- insert : 첨부파일
======
Controller의 역할이 줄었다.
- 요청 파라미터 값 가공
- 응답처리
작업에 좀더 집중!
인터페이스를 만드는이유는 교체하기 쉽게하기 위해서(유지보수에 용이)
impl : 인터페이스 구현체를 만들때 implement약자인 impl이라고 붙이는 경우가 있다.
Default : 보드서비스의 기본객체 기본 구현체