▶ 3일 계획
=> 공부 관련
1) 수업 내용 복습
2) MVC 객체지향 리팩토링
3) 스프링 강의 수강
=> 파이널 프로젝트 관련
1) 노션에 피드백 정리
▶ 문제 정리
1. 인텔리제이 메이븐 빌드 후 jar 파일을 찾던 도중 에러 발생
> 경로를 찾아서 해결
2. 이름 검색을 FirstName으로 바꾸기
@GetMapping("/owners")
public String processFindForm(@RequestParam(defaultValue = "1") int page, Owner owner, BindingResult result,
Model model) {
// allow parameterless GET request for /owners to return all records
if (owner.getFirstName() == null) {
owner.setFirstName(""); // empty string signifies broadest possible search
}
// find owners by first name
String firstName = owner.getFirstName();
Page<Owner> ownersResults = findPaginatedForOwnersFirstName(page, firstName);
if (ownersResults.isEmpty()) {
// no owners found
result.rejectValue("lastName", "notFound", "not found");
return "owners/findOwners";
}
else if (ownersResults.getTotalElements() == 1) {
// 1 owner found
owner = ownersResults.iterator().next();
return "redirect:/owners/" + owner.getId();
}
else {
// multiple owners found
firstName = owner.getLastName();
return addPaginationModel(page, model, firstName, ownersResults);
}
}
=> 파라미터 값과 메서드를 만들어 변경
@Query("SELECT DISTINCT owner FROM Owner owner left join owner.pets WHERE owner.firstName LIKE :firstName% ")
@Transactional(readOnly = true)
Page<Owner> findByFirstName(String firstName, Pageable pageable);
=> 인터페이스 SQL문 변경
▶ 개인 공부
1. 코드의 flow를 읽는 방법
▶ 수업 내용
Spring DAO
- Data Access Framework
- Templete Method Pattern
DAO 클래스 작성
- spring - jdbc 라이브러리 빌드 처리
- ⇒ JdbcTemplate 클래스의 템플릿 메서드를 호출하여 DAO 클래스 작성
JdbcTemplate 객체를 이용하는 방법
- ⇒ JdbcTemplate 객체를 Spring Container에게 제공받아 필드에 저장 - DI
- ⇒ JdbcDaoSupport 클래스 상속받아 JdbcTemplate 객체를 저장한 필드 선언
JdbcTemplate.update(String sql, Object ... object)
- SQL 명령 (CRUD)를 DBMS 서버에 전달하여 실행하는 메서드 - 조작행의 갯수 반환
- ⇒ 매개변수에 SQL 명령과 InParameter(?)에 저장될 값을 차례대로 나열하여 메서드 호출
JdbcTemplate.queryForObject(String sql, RowMapper<T> rowMapper, Object... args )
- ⇒ SQL 명령(Select)을 DBMS 서버에 전달하여 실행하는 메서드
- ⇒ 단일행의 검색결과를 하나의 객체(값)로 반환할 경우 사용되는 메서드
- ⇒ SQL 명령, RowMapper 객체, InParameter 전달 값을 매개변수에 차례대로 나열하여 전달
- 검색 결과를 Java 객체로 매핑하여 반환하기 위한 객체 - 매핑 정보 제공 (ResultSet 과 같은 역할)
- ⇒ mapRow 메서드를 오버라이드 선언하여 매핑정보 제공
- ⇒ 제너릭은 검색행을 java 객체로 표현하기 위한 자료형(클래스) 설정
- RowMapper
EmptyResultDataAccessException
- QueryForObject() 메서드에 의해 전달된 SQL 명령의 검색결과가 존재하지 않는 경우 발생되는 예외
JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args)
- ⇒ SQL 명령(Select)을 DBMS 서버에 전달하여 실행하는 메서드
- ⇒ 다중행의 검색결과를 List 객체로 반환할 경우 사용되는 메서드
- ⇒ SQL 명령, RowMapper 객체, InParameter 전달 값을 매개변수에 차례대로 나열하여 전달
Spring MVC
Command Controller : 클라이언트의 요청을 처리하기 위한 클래스 - Model
- => Spring Framework에서 제공하는 Controller 인터페이스를 상속 받아 작성
- 클라이언트의 요청을 처리하기 위한 명령을 작성하는 메서드
- ⇒ Front Controller(DispatcherServlet)에 의해 자동 호출되는 메서드
- ⇒ HttpServletRequest 객치와 HttpSerlvetResponse 객체를 매개변수를 제공 받아 요청 처리 (WAS 가 줌 - 컨테이너가 )
- ⇒ View 관련 정보를 ModelAndView 클래스의 객체에 저장하여 반환
- 응답 관련 정보를 저장하기 위한 클래스
- ⇒ 요청에 대한 처리 결과와 뷰 페이지 관련 정보를 저장하여 Front Controller(DispatcherServlet)에게 전달
- ModelAndView.addObject(String attributeName, Object attributeValue)
- ⇒ ModelAndView 객체에 요청에 대한 처리 결과를 저장하기 위한 메서드
- ⇒ HttpServletRequest.setAttribute() 메서드와 유사한 기능 제공 (기본이 request scope임)
- 뷰페이지(JSP)에서 EL과 JSTL을 사용하여 응답 처리
- ModelAndView.ViewName(String viewName)
- 뷰 페이지 관련 정보(viewName)을 변경하는 메서드
- handleRequest
pom.xml
https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11
- ⇒ JDBC 기능을 제공하기 위한 Oracle Driver 라이브러리
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
- ⇒ Apache 그룹에서 제공하는 Data Source 라이브러리
https://mvnrepository.com/artifact/org.springframework/spring-jdbc
- ⇒ SpringDAO 기능을 제공하는 라이브러리 - DataSource 관련 기능
- ⇒ spring-tx 라이브러리도 의존관계에 의해 빌드 처리 : 트랜잭션 관리 기능을 제공하는 라이브러리
Spring Configuration File
Apache 그룹에서 제공하는 commons-dbcp2 라이브러리의 BasicDataSource 클래스를 Spring Bean으로 등록
- ⇒ Connection 객체 생성 관련 정보를 필드에 전달하여 저장 - Setter Injection
Spring Framework에서 제공하는 spring-jdbc 라이브러리의 DriverManagerDataSource 클래스를 Spring Bean으로 등록
- => Connection 객체 생성 관련 정보를 필드에 전달하여 저장 - Setter Injection
스프링 빈 → 참조(주입) jdbctemplate - > 참조(주입) dao → 참조(주입) service
Web.xml
- WAS 실행 시 프로젝트 자원을 컨텍스트(웹자원)로 제공하기 위한 정보를 설정한 파일
- ⇒ 리스너 설정, 필터 설정, 서블릿 설정, 에러 페이지 설정 등
context-param
- 컨텍스트로 존재하는 모든 클래스에 값을 제공하기 위한 엘리먼트
- 모든 웹프로그램(Front Controller)에서 공통적으로 사용하기 위한 Spring Bean을 등록하기 위해 제공되는 Bean Configuration File
listener
- WAS 실행 시 Listener 클래스를 객체로 생성하기 위한 엘리먼트
- Listener 클래스 : ServletContextListener 인터페이스를 상속받은 자식클래스⇒ contextDestroyed() 메서드 : Listener 객체 소멸 전 자동으로 호출되는 메서드 - 마무리 작업
- Listener 클래스를 설정하기 위한 엘리먼트
- WebApplicationContext 객체(Spring Container)를 생성하고 Bean Configuration File을 읽어 Spring Bean으로 등록된 모든 클래스를 객체로 생성하여 컨텍스트로 존재하는 모든 클래스에서 사용할 수 있도록 제공하는 Listener 클래스
- ⇒ 누굴 읽어? : context-param 엘리먼트의 contextConfigLocation 이름으로 제공되는 값이 Bean Configuration File이다.
- ⇒ Bean Configuration File 을 엔터 or , or ; 으로 구분하여 설정
- ⇒ Annotation 기반의 Bean Configuration File은 하나만 인식되어 처리
- Listener-class
- ⇒ contextInitialized() 메서드 : Listener 객체 생성 후 자동으로 호출되는 메서드 - 초기화 작업
servlet
- 서블릿 클래스를 웹프로그램(서블릿)으로 등록하는 엘리먼트
- ⇒ Servlet 엘리먼트를 사용하여 Front Controller 기능을 제공하는 웹프로그램을 여러개 등록 가능
- ⇒ DispatcherServlet 클래스(Front Controller)를 웹프로그램으로 등록
- Servlet 클래스에서 필요한 값을 제공하기 위한 엘리먼트
- 클라이언트의 요청을 처리하기 위해 Spring Framework에서 제공하는 Front Controller 클래스
- ⇒ WebApplicationContext 객체로 Bean Configuration File을 읽어 Spring Bean으로 등록된 모든 클래스를 객체로 생성하여 서블릿에서 사용되도록 제공
- init-param
load-on-startup
- WAS 실행 시 서블릿 클래스를 객체로 생성하기 위한 엘리먼트
- ⇒ 클라이언트의 요청 없이 WAS 실행 시 미리 서블릿 클래스를 객체로 생성하기 위해 사용
- ⇒ 엘리먼트 값은 0보다 큰 정수값을 사용하며 값이 작을 수록 먼저 객체로 생성
servlet-mapping
- 웹프로그램(서블릿) 실행을 위해 요청할 URL 주소를 설정하는 엘리먼트
param bean configuration File
SimpleUrlHandlerMapping
- Front Controller(DispatcherServlet)에게 클라이언트 요청을 처리하기 위한 Command Controller 클래스의 Spring Bean의 beanName을 제공하기 위한 클래스
- ⇒ mappings 필드에 Map 객체를 생성하여 인젝션 처리
- ⇒ 클라이언트의 요청 정보 (Key : String)와 Command Controller 클래스의 Spring Bean(Value : String)의 Map 객체의 엔트리로 추가
Spring Framework에서 제공하는 InternalResourceViewResolver 클래스를 Spring Bean으로 등록
- InternalResourceViewResolver : 뷰 이름(View Name)을 전달받아 응답할 뷰페이지로(JSP)로 변환하여 제공하는 클래스
- prefix 필드에는 뷰이름 앞부분에 추가될 값을 인젝션 처리
- suffix 필드에는 뷰이름 뒷부분에 추가될 값을 인젝션 처리
반응형
'레거시' 카테고리의 다른 글
2022.03.16의 기록 (0) | 2022.03.16 |
---|---|
2022.03.15의 기록 (0) | 2022.03.15 |
2022.03.11~03.13의 기록 (2) | 2022.03.12 |
2022.03.08~03.10 의 기록 (0) | 2022.03.09 |
2022.03.07 의 기록 (0) | 2022.03.07 |