관심 Concern 걱정거리, 문제, 할 일(해야할 일) Work, 작업 , 풀어야할 문제
목적이 다른 코드를 섞지마
Seperation of Concern SOC
변하는 것 & (자주) 변하지 않는 것(Template)
Solid의 OCP - Open(허가) & Close Principle 상속OK, 변경 X
Template(상속으로 바뀌는 것 완성), Strategy (매개변수 주입) 패턴
Common & UnCommon Code
중복 코드- 공통 코드로 분리
그룹화와 분리가 중요
서블릿 작은 서버 프로그램
= 메서드 요청 들어오면 받아서 처리 후 응답함
서블릿의 처리 흐름
View 출력의 분리, 출처: 남궁성_Spring의 정석 교안
관심사의 분리
공통 코드의 분리 - 입력의 분리 request.getParameter()
각 컨트롤러의 입력 부분을 제거 후 단독 입력을 앞에 위치
메서드 선언부
객체 배열 요소 각각 매개변수로 받기
자동 형변환
변하는 것과 변하지 않는 것의 분리 - 출력(view)의 분리
Model 객체 필요 - 결과 출력용 값 저장
[기존] 같은 메서드 내에 있어서 처리한 값을 출력이 가능했음
출력 코드
HTML 응답은 자주 변해서 분리 필수
ex. 은행 거래내역 조회 1년 - pdf, csv, excel 파일 중 선택한 형식 보여주기
전처리
입력을 공통 처리하자
DispatherServlet
입력 & 변환 (자동)창구 역할, 공통 처리 후 전달
요청을 받아서 뿌려줌
모델 객체 생성 - 결과 저장소
controller에 전달
약속, 틀
main() { 코드 }
스레드 run () { 코드 }
서블릿 service() { 코드 }
=> 하는 일을 똑같음 . 메서드 명만 다름
Web 서비스 요청
파일(리소스 집합) 요청.
url ‘경로/파일이름’
MVC 패턴
Controller처리
Model결과 저장소.
정의 : 분리된(코드 위치가 다른) Controller와 View간의 데이터를 주고 받을 수 있게 하는 객체
자료구조 : Map (Key, Value)Key Value
“year”
2025
“month”
5
“day”
25
“yoil”
“금”
단점 : 쪼갬으로서 성능은 떨어짐
장점: 유지보수성 ↑
java
닫기
model.addAttribute("name", "Hello");
원리
컨트롤러가 return 뷰; 하면 request.setAttribute(”myDate”, myDate)로 내용(속성) 복사 후 jsp로 요청 객체를 넘김.
${myDate.year} =/= myDate가 참조하는 실제 인스턴스 접근 X
request.getAttribute("myDate") → 같은 객체 참조 획득
Introspector 로 getter호출
반환값(2025)을 문자열로 렌더링
model.addAttribute(”myDate”, myDate);
주의 사항
model.addAttribute()를 생략하면 Spring은 타입 이름을 decapitalize한 값을 모델 키로 자동 등록
java
닫기
// 4단계. 메서드의 매개변수를 변경. int -> MyDate@Controller// 1. 원격 프로그램 등록publicclassYoilTellerS4{@RequestMapping("/yoilpracs4")//2. URL과 메서드 연결 (서블릿)public String getYoil(MyDate2 myDate2, Model model){// TODO MyDate2 myDate 가 안되는 이유// .. 생략 .. // TODO 왜 year, month, day가 출력이 안되나? model.addAttribute("myDate", myDate2);//model.addAttribute("myDate2", myDate2);// 위에 처럼 명시적으로 작성하지 않으면 톰캣이 자동으로 등록할 떄 myDate2로 씀return"yoilprac"; // WEB-INF/views/yoilprac.jsp// .. 생략 .. }// .. 생략 .. }
View 출력
결과 보여줌
경로와 확장자는 항상 동일해서 view 이름(바뀌는 부분)만 적게함.
return "yoil"; // WEB-INF/views/yoil.jsp
에러 페이지 - 유효성 검사
🟢튜닝. gpt가 쪼갠 코드를 붙임(같은 스코프)으로써 성능을 올릴 수 있음
Spring MVC 구조
Spring MVC 원리, 출처: 남궁성 Spring 정석 교안
요청이 들어오면 DispatcherServlet이 요청을 받음
DS가 Controller에게 요청내용을 전달
Controller가 요청 내용 기반 처리 후 결과를 Model에 저장, 작업 결과 보여줄 View 지정
반환타입 String 뷰이름 반환
반환타입 void 매핑된 url의 끝단어가 뷰 이름 (잘 안씀) view 를 반환하지 않을 때 url과 동일한 jsp인 view를 보여줌
3. 반환타입 ModelAndView Controller가 model 만들고 사용 가능 (잘 안씀)
StringviewName= obj.main(2021, 10, 1, model); // 아래 줄과 동일. 매개변수 목록이 메서드마다 다르기 때문에 가변인자 사용StringviewName=(String)main.invoke(obj, newObject[]{2021, 10, 1, model }); // reflection api 이용한 호출