관심 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”
“금”
단점 : 쪼갬으로서 성능은 떨어짐
장점: 유지보수성 ↑
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한 값을 모델 키로 자동 등록
// 4단계. 메서드의 매개변수를 변경. int -> MyDate
@Controller // 1. 원격 프로그램 등록
public class YoilTellerS4 {
@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 만들고 사용 가능 (잘 안씀)
String viewName = obj.main(2021, 10, 1, model); // 아래 줄과 동일. 매개변수 목록이 메서드마다 다르기 때문에 가변인자 사용
String viewName = (String)main.invoke(obj, new Object[] { 2021, 10, 1, model }); // reflection api 이용한 호출
2. 넘겨 준 값으로 동적으로 객체 배열 만듦
Object[] argArr = new Object[main.getParameterCount()];
톰캣이 Model 인스턴스를 자동으로 생성하는 원리
model 인터페이스를 구현한 클래스의 객체가 존재하지 않을 때. model의 구현체를 생성함
// paramType중에 Model이 있으면, 생성 & 저장
if(paramType==Model.class) {
argArr[i] = model = new BindingAwareModelMap();
} else if(value != null) { // map에 paramName이 있으면,
// value와 parameter의 타입을 비교해서, 다르면 변환해서 저장
argArr[i] = convertTo(value, paramType); // 자동변환 String -> int
}