- 1005

Yung·2022년 10월 5일
0

Java223bitcamp

목록 보기
15/26

070. 파일 업로드 처리 II

어떤 클래스가 무슨일을하는지, 흐름과 구조를 여러분이 알고있어야 한다.
객체지향 프로그래밍을 잘짜는 방법이고 실력을 향상시키는 방법
파일업로드 처리기법 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에서 업루로직을 분리

071. DAO에서 비즈니스 로직 분리: Controller에서 비즈니스 로직처리

  • DAO에서 비즈니스 로직을 분리하는 이유와 방법(DAO의 역할을 더 단순화시키는 작업)

1단계 - 게시글 등록과 관련된 업무 흐름을 DAO에서 분리한다.

  • MariaDBBoardDao 클래스 변경 (insert 변경)
  • BoardAddController

2단계 - 게시글 변경과 관련된 업무 흐름을 DAO에서 분리한다.

  • MariaDBBoardDao 클래스 변경 (update 변경)
  • BoardUpdateController

3단계 - 게시글 삭제과 관련된 업무 흐름을 DAO에서 분리한다.

  • MariaDBBoardDao 클래스 변경 (delete 변경)
  • BoardDeleteController 변경
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"
비즈니스로직을 분리
=> 별도 클래스로 정의
'별도 클래스' : 서비스 컴포넌트

072. Controller에서 비즈니스 로직 분리하기: 서비스 컴포넌트 도입

  • Controller에서 비즈니스 로직을 분리하는 이유
  • 서비스 컴포넌트의 역할 이해

1단계 - Controller에서 비즈니스 로직을 분리하여 Service 클래스로 옮긴다.

  • BoardAddController 클래스 변경
  • BoardUpdateController 클래스 변경
  • BoardDeleteController 클래스 변경
  • BoardService 클래스 생성
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의 역할이 줄었다.
 - 요청 파라미터 값 가공
 - 응답처리
 작업에 좀더 집중!

Controller - Service - DAO의 관계

073. 서비스 컴포넌트에 인터페이스 적용: 서비스 객체를 교체하기 쉽게 만들기

  • 서비스 객체에 인터페이스를 적용하는 이유와 방법

1단계 - BoardService 객체를 인터페이스와 구현체로 분리한다.

  • BoardService 클래스를 인터페이스로 변경
  • DefaultBoardService 클래스 생성
    • 기존의 BoardService 클래스를 인터페이스 구현 클래스로 만든다.

2단계 - MemberService 객체를 인터페이스와 구현체로 분리한다.

  • MemberService 클래스를 인터페이스로 변경
  • DefaultMemberService 클래스 생성
    • 기존의 MemberService 클래스를 인터페이스 구현 클래스로 만든다.

3단계 - 서비스 객체를 준비할 때 새로 생성한 구현체를 사용한다.

  • ContextLoaderListener 클래스 변경

인터페이스를 만드는이유는 교체하기 쉽게하기 위해서(유지보수에 용이)
impl : 인터페이스 구현체를 만들때 implement약자인 impl이라고 붙이는 경우가 있다.
Default : 보드서비스의 기본객체 기본 구현체

0개의 댓글