< 수업 순서 - 2024.09.04 >
⭐SpringMVC 기능을 사용해 웹프로그램을 작성하는 방법⭐
테이블 → DTO 클래스 → DAO 클래스(Mybatis) → Service 클래스 → Controller 클래스 → 단위 프로그램 테스트 - 테스트 프로그램(JUnit) → JSP 문서(HTML 문서)와 결합하여 실행(통합 테스트)
1. Student : DTO 클래스
-
DTO 클래스 : 테이블의 행을 Java 클래스로 표현해 객체로 생성하기 위한 클래스. 데이터 처리 클래스(DAO or Service 클래스)의 메소드에서 매개변수로 값을 전달받거나 값을 반환하기 위해 작성
-
@Builder 어노테이션 : Test 프로그램 생성을 위해 작성. Controller 클래스의 요청 처리 메소드에서는 데이터 처리에 필요한 명령으로 Service 객체로 메소드를 호출해 작성
2. StudentDAO 인터페이스 : 결합도를 낮춰 유지보수의 효율성을 높이기 위해 작성
3. StudentDAOImpl : DAO 클래스
-
DAO 클래스 : 저장매체에 행을 삽입하거나 저장된 행을 변경, 삭제, 검색하는 기능을 제공하기 위한 클래스
-
DBMS 서버를 저장매체로 사용해 SQL 명령을 전달하여 행의 삽입, 변경, 삭제, 검색 처리
⭐SpringMVC 기능으로 웹프로그램 작성시 Mybatis 프레임워크를 사용해 DAO 클래스를 작성하는 방⭐
1. DataSource 관련 라이브러리와 Mybatis 관련 라이브러리를 프로젝트에 빌드 처리 - ojdbc, spring-jdbc(spring-tx), mybatis, mybatis-spring
4. pom.xml 수정 : 라이브러리 빌드 처리



- pom.xml 파일에 빌드 처리

2. Mybatis 프레임워크의 환경설정파일(mybatis-config.xml - setting 엘리먼트) 작성
- [src//main/webapp] 폴더에 환경설정파일을 작성해야 스프링 컨테이너(WebApplicationContext 객체)가 환경설정파일을 제공받아 SqlSessionFactory 객체 생성 가능
5. mybatis-config.xml([src//main/webapp] spring에 작성하는 것을 권장)
3. Spring Bean Configuration File(root-context.xml)에 DataSource, SqlSessionFactory, SqlSession, TransactionManager 관련 클래스를 Spring Bean으로 등록
6. root-context.xml(Spring Bean Configuration File)
-
root-context.xml : 모든 Front Controller에게 객체를 제공할 수 있도록 클래스를 Spring Bean으로 등록하기 위한 Spring Bean Configuration File
-
web.xml : 해당 Front Controller만 사용 가능
-
DataSource 관련 클래스(DrivaerManagerDataSource 클래스)를 Spring Bean으로 등록
→ 필드에 Connection 객체 생성에 필요한 값이 저장되도록 값 주입 - Setter Injection(property 엘리먼트)

-
SqlSessionFactory 관련 클래스(SqlSessionFactoryBean 클래스 - mybatis spring 라이브러리)를 Spring Bean으로 등록 → 필드에 SqlSessionFactory 객체 생성에 필요한 값 또는 객체가 저장되도록 값 주입하거나 의존성 주입 - Setter Injection

- configLocation 필드에 Mybatis 프레임워크의 환경설정파일(mybatis-context.xml)의 경로가 저장되도록 값 주입
- dataSource 필드에는 DataSource 관련 클래스의 Spring Bean 식별자(beanName)를 사용해 객체가 저장되도록 의존성 주입
- Mybatis 프레임워크의 환경설정파일에서 environment 엘리먼트와 유사한 기능 제공⬇️
- typeAliasesPackage 필드에는 DTO 클래스를 작성한 패키지가 저장되도록 값 주입
- XML 기반의 매퍼 파일에서 Java 자료형 대신 사용할 별칭을 제공하기 위한 설정
- Mybatis 프레임워크의 환경설정파일에서 typeAlias 엘리먼트의 package 엘리먼트와 유사한 기능 제공⬇️

- mapperLocation 필드에 List 객체를 생성하여 저장되도록 의존성 주입
- List 객체의 요소에는 XML 기반의 매퍼 파일의 경로를 요소값으로 저장 - 매퍼 등록
- Mybatis 프레임워크의 환경설정파일에서 mapper 엘리먼트와 유사한 기능 제공

-
SqlSession 관련 클래스(SqlSessionTemplate 클래스 - mybatis spring 라이브러리)를 Spring Bean으로 등록 → 필드에 SqlSession 객체를 제공하는 SqlSessionFactory 객체가 저장되도록 의존성 주입 - Constructor Injection(constructor-arg 엘리먼트)
- destroy-method 속성을 사용해 SqlSessionTemplate 객체가 소멸되기 전에 clearCache 메소드가 자동 호출되도록 설정 - SqlSession 객체 사용 후 close() 메소드 호출 생략 가능

4. 매퍼 파일을 사용해 DAO 클래스 작성
7. StudentMapper 인터페이스
8. StudentMapper.xml
- 매퍼 파일 등록

- ➡️설명 : StudentMapper 인터페이스와 매핑시켜주고 각각의 SQL 쿼리를 자바 메서드와 연결해주는 역할을 하고 있다.
9. servlet-context.xml
- DAO 클래스 등록

10. StudentService 인터페이스
11. StudentServiceImpl
-
Service 클래스 : 클라이언트 요청에 대한 데이터 처리 기능을 제공하기 위한 클래스 → Service 클래스의 메소드는 데이터 처리 기능에 필요한 명령으로 DAO 객체로 메소드를 호출해 작성
-
@Service 어노테이션을 사용하여 Controller 클래스에서 객체로 제공받아 사용할 수 있도록 Spring Bean으로 등록
-
@Service 어노테이션을 스프링 컨테이너가 처리하기 위해서는 반드시 클래스가 작성된 패키지를 Spring Bean Configuration File(servlet-context.xml)의 component-scan 엘리먼트로 검색되도록 설정


12. StudentController
-
Controller 클래스 : 클라이언트의 요청을 처리하는 기능을 제공하기 위한 클래스
-
@Controller 어노테이션을 사용해 Front Controller에서 객체로 제공받아 사용할 수 있도록 Spring Bean으로 등록
-
@Controller 어노테이션을 스프링 컨테이너가 처리하기 위해서는 반드시 클래스가 작성된 패키지를 Spring Bean Configuration File(servlet-context.xml)의 component-scan 엘리먼트로 검색되도록 설정


13. student_add.jsp : 학생정보 입력 페이지
14. student_display.jsp : 학생정보 출력 페이지
Mybatis 프레임워크의 로트 팩토리에 의해 발생되는 로그 이벤트를 Spring 프레임워크의 로그 구현체로 기록하는 방법
1. log4jdbc-log4j2-jdbc4 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml
15. pom.xml



2. Spring Bean Configuration
16. root-context.xml
3. [src/main/resources] 폴더에 [log4jdbc.log4j2.properties] 파일 저장
17. log4jdbc.log4j2.properties
4. SpyLogDelegator
18. log4j.xml : logger 엘리먼트 추가


< 수업 순서 - 2024.09.05 >
Spring Test 프로그램
→ src/test/java - xyz.itwill.spring 패키지에 생성
SpringTest 기능을 사용해 단위 프로그램을 검사하는 테스트 프로그램을 작성하는 방법
→ 단위프로그램 : DAO 클래스, Service 클래스, Controller 클래스
테스트 프로그램 : 요청에 대한 데이터 처리를 하는 클래스들이 갖고 있는 메소드가 제대로 동작되는지 확인하는 작업
1. junit 라이브러리(이미 생성되어 있음)와 spring-test 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml
1. pom.xml


- junit 라이브러리, spring-test 라이브러리 scope 속성 주석 처리
2. 테스트 프로그램에서 사용할 로그 구현체의 환경설정파일 변경
2. log4j.xml : main/resources 폴더에 있는 log4j.xml 복붙 후 logger 엘리먼트 추가

3. [src/test/java] 패키지 폴더에 테스트 클래스(테스트 프로그램) 작성 → junit 라이브러리와 spring-test 라이브러리의 scope 속성을 주석 처리한 후 클래스 작성(for 자동완성)
4. 테스트 프로그램 실행
2. DataSourceTest.java : 데이터베이스에 연결이 정상적으로 이루어졌는지 올바른 쿼리가 실행되는지, 트랜젝션 관리가 제대로 이루어지는지 등의 역할
-
@RunWith : 테스트 프로그램을 실행하기 위한 클래스를 설정하는 어노테이션 → 테스트 클래스를 객체로 생성하여 테스트 메소드를 호출해 테스트 명령 실행
- value 속성 : 테스트 프로그램을 실행하기 위한 클래스의 Class 객체를 속성값으로 설정
- SpringJUnit4ClassRunner 클래스는 스프링 컨테이너(ApplicationContext 객체)를 생성하여 테스트 클래스에게 사용할 객체 제공
-
@WebAppConfiguration : SpringJUnit4ClassRunner 클래스에서 생성되는 스프링 컨테이너를 ApplicationContext 객체가 아닌
WebApplicationContext 객체로 제공하기 위한 어노테이션
-
@ContextConfiguration : 스프링 컨테이너에게 Spring Bean Configuration File을 제공하는 어노테이션
-
location 속성 : Spring Bean Configuration File 경로, 여러개인 경우 {}기호를 사용해 배열, file 접도사를 사용해 경로 작성
-
root-context.xml : dataSource 객체, SqlSesson 객체 등이 있다

-
@Test : 테스트 메소드로 설정하기 위한 어노테이션 → SpringJUnitClassRunner 클래스에 의해 테스트 클래스가 객체로 생성된 후 자동 호출되는 메소드

-
결과 콘솔 출력

3. StudentServiceTest : 실제로 비지니스 로직이 정상적으로 잘 동작하는지 확인하는 역할
-
기본 Test 어노테이션
- Spring Bean Configuration File 2개 제공하기 위해 {} 기호를 사용하여 배열
- servlet-context.xml : DAO, Service, Controller 클래스의 Spring Bean 존재

-
@FixMethodOrder : 테스트 메소드의 호출순서를 설정하기 위한 어노테이션
- value 속성 : MethodSorters Enum 자료형의 상수필드를 속성값으로 설정
→ MethodSorters.DEFAULT : 동일한 순서로 테스트 메소드 호출
→ MethodSorters.JVM : 불규칙한 순서로 테스트 메소드 호출
→ MethodSorters.NAME_ASCENDING : 이름 순서로 테스트 메소드 호출
-
builder : 원하는 객체의 필드에게 초기값을 줄 수 있음

-
결과 콘솔 출력 - insert, select 명령 성공

4. StudentControllerTest
< 사용자(User)가 글(Board) 작성하면 100 포인트 +, 삭제하면 100 - 되는 프로그램 작성 >
5. 오라클 테이블 생성
-
point_user : create table point_user(id varchar2(20) primary key, name varchar2(30), point number);
-
point_board : create table point_board(num number primary key, writer varchar2(20), content varchar2(100));
-
시퀀스 : create sequence point_board_seq;
6. PointUser : DTO 클래스 - main 폴더에 생성
7. PointBoard : DTO 클래스 - main 폴더에 생성
8. PointUserDAO 인터페이스 : 추상메소드 작성
9. PointUserDAOImpl(DAO 클래스) : @Repository를 사용해 Spring Bean으로 등록
-
@RequredArgsConstructor(생성자 레벨의 의존성 주입) : 원하는 필드만 초기화를 시켜 의존성 주입 - final 식별자를 붙여준 필드만 해당
-
SqlSession 객체의 기능 : 데이터베이스와의 상호작용 관리, 쿼리 실행, 트랜잭션 처리
- 쿼리 실행 : select, insert, update, delete 같은 SQL 작업을 실행
- 매퍼 가져오기 : getMapper() 메소드를 사용해 매퍼 인터페이스를 가져와 사용
- 트랜잭션 관리 : commit(), rollback() 메소드 사용
- 연결 닫기 : 작업이 끝나면 close() 메소드 사용하여 연결 닫기
-
getMapper() 메소드 : 매퍼 인터페이스를 불러와 데이터베이스에 쿼리를 실행하거나 데이터를 가져오는 기능
➡️설명 : DAO 클래스를 DAO 인터페이스를 상속받아 메소드를 오버라이딩하고 상속받은 메소드의 반환값은 Mapper 인터페이스로 인해 Mapper xml에서 삽입, 수정, 삭제, 검색된 값을 가져와 반환
10. root-context.xml : SqlSession 관련 클래스(SqlSessionTemplate 클래스)를 Spring Bean으로 등록
- 필드에 SqlSession 객체를 제공하는 SqlSessionFactory 객체가 저장되도록 의존성 주입 - Constructor Injection
- destroy-method 속성 : SqlSessioTemplate 객체가 소멸되기 전에 clearCache 메소드가 자동 호출되도록 설정 - SqlSession 객체 사용 후 close() 메소드 호출 생략 가능

10. PointUserMapper 인터페이스 : insert, update, select 추상메소드 작성
→ DAO 인터페이스와 Mapper 인터페이스는 동일하다.
11. PointUserMapper.xml : mapper 엘리먼트의 하위 엘리먼트인 inser, update, delete, select 엘리먼트를 사용해 데이터 가져오기
12. PointBoardMapper 인터페이스
13. PointBoardMapper.xml : insert, delete, select 엘리먼트 사용
14. PointBoardDAO 인터페이스
15. PointBoardDAOImpl : DAO 인터페이스 상속받아 메소드 오버라이딩
16. PointUserService 인터페이스
17. PointBoardServiceImpl
18. PointUserServiceTest

19. PointBoardServiceTest : PointBoardServiceImpl 클래스의 메소드가 제대로 동작하는지 확인하는 테스트 프로그램
- 예외가 발생되면 삽입이 되면 안된다. 예외 발생전에 게시글 삽입에 대한 SQL 명령은 이미 실행되어 POINT_BOARD 테이블에 비정상적인 행 삽입 처리
- 예외가 발생되기 전에 실행된 모든 SQL 명령은 롤백 처리 - TranscationManager 사용해 일관성 있는 트렌젝션 관리 기능 제공
⭐SpringMVC 기능을 사용한 웹프로그램에서 TransactionManager 객체를 사용해 트랜잭션을 관리하는 방법
1. spring-tx 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml
- spring-jdbc 라이브러리를 빌드 처리하면 라이브러리 의존관계에 의해 자동적으로 spring-tx 라이브러리 빌드 처리
2. Spring Bean Configuration File(root-context.xml)에 TransactionManager 관련 클래스를 Spring Bean으로 등록
20. root-context.xml : TransactionManager 관련 클래스(DataSourceTranscationManager 클래스)를 Spring Bean으로 등록
- dataSource 필드에 TransactionManager 객체에 의해 트랜잭션이 관리될 DataSource 객체가 저장되도록 의존성 주입 - Setter Injection(property)

3. Spring Bean Configuration File(servlet-context.xml)에 트랜잭션 처리를 위한 Spring AOP 설정
21. servlet-context.xml
① TransactionManager 객체를 사용해 트랜잭션을 관리할 수 있도록 설정하기 위해 tx 네임스페이스에 spring-tx.xsd 파일을 제공받아 엘리먼트를 사용할 수 있도록 설정

- advice : TransactionManager 객체로 Advisor를 생성하기 위한 엘리먼트
- Advisor : 삽입위치(JoinPoint)가 정해져 있는 횡단관심코드가 작성된 Advice 객체
- id 속성 : advice 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- transcation-manager 속성 : TransactionManager 기능을 제공하는 Spring Bean의 식별자(beanName)를 속성값으로 설정
→ TransactionManager 객체를 사용해 예외가 발생되지 않은 경우 커밋 처리하고 예외가 발생될 경우 롤백 처리
- attribute : TransactionManager 객체에 의해 커밋 또는 롤백 처리될 메소드의 목록을 설정하기 위한 엘리먼트 - 하위 엘리먼트 : method
- method 엘리먼트 : TransactionManager 객체에 관리될 메소드의 이름과 트랜잭션 처리 방식을 설정
- name 속성 : TransactionManager 객체에 관리될 메소드의 이름 - 메소드의 이름에는 [*] 기호를 사용해 설정 가능
- rollback-for 속성 : 롤백 처리하기 위한 예외를 속성값으로 설정
- read-only 속성 : false(기본) 또는 true(트랜잭션 불필요) 중 하나

② Spring AOP 기능을 사용하기 위해 aop 네임스페이스에 spring-aop.xsd 파일을 제공받아 엘리먼트를 사용할 수 있도록 설정

- advisor : Advisor를 제공받아 사용하기 위한 엘리먼트
- advisor-ref 속성 : Advisor를 생성한 advice 엘리먼트의 식별자를 속성값으로 설정

➡️설명 : pointcut 속성에 설정된 패키지 내의 모든 메소드에 트랜잭션을 자동으로 처리해 줌(해당 메소드 왼쪽에도 위와같이 굽은 양쪽 화살표 표시가 되어 있다.)
< 수업 순서 - 2024.09.06 >
TransactionManager 등록을 위해 어노테이션 이용 - Advisor을 만들어주지 않아도 됨, 트렌젝션 관리를 위한 AOP 설정 대신 @Transactional 어노테이션 사용 가능
- TransactionManager를 이용해서 관리하고 싶은 메소드가 있으면 메소드 위에 @Transactional 어노테이션을 써주면 관리가 된다.

위 표시를 위해 설정해야할 것이 있음
1. servlet-context.xml : tx 엘리먼트, spring aop 엘리먼트 주석 처리
2. root-context.xml
→ DAO를 쓸 때마다 connection을 생성했는데 @Transactional을 사용하면 1개의 connection으로만 데이터 처리를 하고 예외가 발생하면 그 위치에서 바로 롤백처리 가능.
- DAO객체가 가지고 있는 Connection은 하나만 이용해서 DAO 객체가 메소드를 호출할 수 있도록 한다.
- AutoCommit기능을 false로 만들어줘 자동적으로 commit이 안되게 만들어준다.
➡️설명 : @Transcational 어노테이션을 사용한 클래스 혹은 메소드에서 예외가 발생되면 롤백 처리. Spring 프레임워크에서는 TransactionManager을 사용해 일관성 있는 트랜잭션 관리 가능, 일반적으로 service 클래스에서 많이 사용
3. PointBoardServiceTest
- @FixMethodOrder : 테스트 메소드 실행 순서를 제어하는 어노테이션
- MethodSorters.NAME_ASCENDING) : 테스트 메소드가 이름순으로 실행
➡️설명 : test 메소드에 @Transactional 어노테이션 사용한 경우 - test 프로그램을 만들때 예외와 상관없이 무조건 롤백 처리하게 만들어 삽입, 변경, 삭제가 테이블에 적용이 안되게 한다.