Spring.08_Spring myBatis

이혜민·2024년 9월 4일

spring

목록 보기
9/18

< 수업 순서 - 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에 작성하는 것을 권장)

  • setting 하나만 작성해주고 나머지는 스프링 컨테이너가 해줌

  • 이클립스 mybatis-context.xml

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 엘리먼트 추가

  • log 이벤트 콘솔 결과

< 수업 순서 - 2024.09.05 >

Spring Test 프로그램

→ src/test/java - xyz.itwill.spring 패키지에 생성

SpringTest 기능을 사용해 단위 프로그램을 검사하는 테스트 프로그램을 작성하는 방법

→ 단위프로그램 : DAO 클래스, Service 클래스, Controller 클래스

테스트 프로그램 : 요청에 대한 데이터 처리를 하는 클래스들이 갖고 있는 메소드가 제대로 동작되는지 확인하는 작업

1. junit 라이브러리(이미 생성되어 있음)와 spring-test 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml

1. pom.xml

  • spring-test 라이브러리 빌드 처리

  • 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 객체로 제공하기 위한 어노테이션

    • dataSource 객체를 알아서 저장
  • @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

  • MokMvc 객체 : 요청과 응답을 가상으로 제공하기 위한 객체 - Front Controller 기능 제공

  • @Befor : 테스트 메소드 호출 전에 샐행될 명열이 작성된 메소드에 사용하는 어노테이션 → 초기화 처리하는 기능을 제공하는 메소드


< 사용자(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

  • service 클래스 : 클라이언트 요청에 대한 데이터 처리 기능을 제공하기 위한 클래스

  • @Transactional : TransactionManager 객체에 의해 트렌젝션 관리 기능을 제공하는 어노테이션. 이 어노테이션을 작성하면 해당 메소드나 클래스에 트랜잭션 처리가 필요하다는 것을 의미.

    • TransactionManager 객체 : 트랜젝션을 시작, 커밋, 롤백하는 작업을 하는 객체. 트랜잭션은 데이터베이스 작섭(insert, update, delete)을 묶어서 원자적으로 처리하는 것 즉, 작업 중 하나라도 실패하면 전체 트랜잭션이 롤백되고 데이터는 이전 상태로 돌아감
    • rollbackFor 속성 : 롤백 처리될 예외 클래스의 Class 객체를 속성값으로 설정 - 생략 가능

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

  • Spring Bean Configuration File에서 tx 네임스페이스에 spring-tx.xsd 파일을 제공 받아야만 anntation-driven 엘리먼트 사용 가능

  • annoation-driven : @Transactional 어노테이션을 사용해 TransactionManager 객체로 트랜잭션 관리 기능을 제공하는 엘리먼트

→ DAO를 쓸 때마다 connection을 생성했는데 @Transactional을 사용하면 1개의 connection으로만 데이터 처리를 하고 예외가 발생하면 그 위치에서 바로 롤백처리 가능.

  • DAO객체가 가지고 있는 Connection은 하나만 이용해서 DAO 객체가 메소드를 호출할 수 있도록 한다.
  • AutoCommit기능을 false로 만들어줘 자동적으로 commit이 안되게 만들어준다.

➡️설명 : @Transcational 어노테이션을 사용한 클래스 혹은 메소드에서 예외가 발생되면 롤백 처리. Spring 프레임워크에서는 TransactionManager을 사용해 일관성 있는 트랜잭션 관리 가능, 일반적으로 service 클래스에서 많이 사용

3. PointBoardServiceTest

  • @FixMethodOrder : 테스트 메소드 실행 순서를 제어하는 어노테이션
    • MethodSorters.NAME_ASCENDING) : 테스트 메소드가 이름순으로 실행

➡️설명 : test 메소드에 @Transactional 어노테이션 사용한 경우 - test 프로그램을 만들때 예외와 상관없이 무조건 롤백 처리하게 만들어 삽입, 변경, 삭제가 테이블에 적용이 안되게 한다.

0개의 댓글