Spring Framework과정 Day4 - HiroSung/Study GitHub Wiki

Day4

Ch11. 데이터베이스 연동

  • WAS에 위치

    • tomcat 설치폴더 /conf/server.xml의 <Resource name="jdbc/spring" auth="Container" : 이름 type="javax.sql.DataSource" : 객체타입 (Inerface) driverClassName="oracle.jdbc.OracleDriver" : 구현객체. 톰캣은 tomcat-dbcp lib를 통해서 connection을 관리함 url="jdbc:oracle:thin:@localhost:1521:orcl" username="spring" password="12345" initialSize="1" maxTotal="10" maxIdle="1"/>
    • web appl에서 참고하기 위해서는 context.xml에서 <ResourceLink name="jdbc/spring" : web appl에서 참고하는 이름 global="jdbc/spring" type="javax.sql.DataSource"/>
    • tomcat/conf 폴더의 몇개의 파일을 이클립스 서버에서 수행시 복사해서 가져가게됨. 그래서, conf 변경시 이클립스의 서버를 지우고 다시 등록해야 함.
    • web application에서 설정.
  • Ch11BoardDao.java에 SQL, conn등 설정하는데 이러한 형태로 활용되지 않음. 그래서, Service에 정의해서 사용하고, jdbc template를 사용함. RuntimeException 발생(rollback처리함)

  • Spring JDBC지원 API : JDBC Template

    • JDBC Template의 특징
      • 중복되는 JDBC코드를 줄여준다.
      • try-catch-finally를 하지 않는다. DataAccessException을 throws함.
      • Spring의 트랜잭션 관리를 사용할 수 있다.
      • 행검색 메소드
      • 삽입,수정,삭제 메소드
      • 스칼라값 리턴 메소드
    • 그래서 mybatis, ibatis를 사용하지 않고 jdbc template를 많이 활용함
    • pom.xml에 spring-jdbc이 의존성 설정이 되어 있어야 함.
    • WEB-INF/spring/root-context.xml 파일에 아래와 같이 설정되어 있어야 함.
    • RowMapper : DB의 행을 객체로 매핑함
  • DAO(Data Access Object) 작성

    • DAO 클래스의 작성요령 (p.44 중요)
      • CRDU의 메소드만 작성한다.
      • 테이블당 1개씩 작성하는 것을 원칙으로 함. 단 2테이블에 하나의 DAO를 만들 수 있음.
  • Ch11BoardDao.java

    • jdbcTemplate.query
    • jdbcTemplate.queryForObject
  • 예외처리, Tran.처리

    • Controller에서 try-catch처리 하지만. 스프링프레임웍에서는 예외처리를 공통코드로 작성해서 하는 것이 좋음.
    • Tran은 Service에서 처리하고 try~catch 도 처리 해야 함. rollback 처리도.
  • Service 객체의 존재의이유

    • Controller에 기능중심의 코드가 들어가게 되면, 중복코드가 많아짐.
    • Controller에서는 유효성만 검증하고, Service에서 처리된 결과를 받아서 response 하도록 구성하는 것이 좋음.
    • 선언적 F/W 을 작성했을때, try-catch 잡지 않을 경우 runtimeexception일 발생하므로 service에서 정의 않는 것이 좋음.

Ch12. ORM 연동

  • ORM의 종류에 JPA, hibernate, mybatis인데, mybatis는 SQL Mapper에 가까움.

  • MyBatis

  • MyBatis 설정

    • 의존성 설정 (pom.xl)

    • SqlTemplate 설정 (root-context.xml)

    • /WEB-INF/mybatis 폴더 생성하고, board.xml 파일 생성

    • board.xml 파일

      <mapper namespace="BoardMapper">

      • 참고 네임스페이스(Namespaces)에 대한 설명
        • 네임스페이스(Namespaces)가 이전버전에서는 사실 선택사항이었다. 하지만 이제는 패키지경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 필수로 사용해야 한다.네임스페이스은 인터페이스 바인딩을 가능하게 한다. 네임스페이스을 사용하고 자바 패키지의 네임스페이스을 두면 코드가 깔끔해지고 마이바티스의 사용성이 크게 향상될 것이다.
        • 이름 분석(Name Resolution): 타이핑을 줄이기 위해 마이바티스는 구문과 결과매핑, 캐시등의 모든 설정엘리먼트를 위한 이름 분석 규칙을 사용한다.
        • “com.mypackage.MyMapper.selectAllThings”과 같은 패키지를 포함한 전체 경로명(Fully qualified names)은 같은 형태의 경로가 있다면 그 경로내에서 직접 찾는다.
        • “selectAllThings”과 같은 짧은 형태의 이름은 모호하지 않은 엔트리를 참고하기 위해 사용될 수 있다. 그래서 짧은 이름은 모호해서 에러를 자주 보게 되니 되도록 이면 전체 경로를 사용해야 할 것이다.
  • Board 테이블 Mapper XML

    • id vs result
      • 키로 정의된 컬럼은 id로 사용하는 것이 좋음.
      • 메모리에 객체가 저장되어 속도가 향상됨.
      • MyBatis는 요청된 것을 객체풀에 등록되고 관리하고 있는데, 객체풀에서 찾을 id가 무엇인지 정의할때 id를 정의함. cache를 사용할때 가능. 단, cache를 사용하고 객체풀과 DB의 sync 맞추기가 어려워짐은 참고 바람.

Ch13. AOP/트랜잭션/예외처리

  • 횡단관심사, 핵심관심사 분리
    • 실행시에는 결합해서 실행하고자 하는것이 AOP 이다
  • AOP 용어
    • Pointcut : 핵심로직으로 수행되는 메소드가 무엇이다! 라고 지정하는 것.
    • Aspect
    • Weaving
    • Advice : after, before, around
  • Pointcut
    • Annotation으로 생성자,클래스,메소드 위에 항상 정의되어야 함.
    • @Pointcut("execution(public * controller.Ch13Controller.*(..))") public 메소드가 Ch13Controller에 정의된 모든 메소드와 변수가 수행될때 정의
  • Weaving방식
    • 런타임시 생성됨
  • 스프링에서의 AOP 방식
  • Ch13Aspect.java
    • board메소드는 로그인 해야 수행되도록 하고자 함 @Pointcut("execution(public * com.mycompany.myapp.controller.Ch13Controller.board*(..))") private void loginCheck() {}

      @Around("loginCheck()") public Object loginCheckAdvice(ProceedingJoinPoint joinPoint) throws Throwable { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); String mid = (String)requestAttributes.getAttribute( "sessionMid", RequestAttributes.SCOPE_SESSION); if(mid == null) { requestAttributes.setAttribute( "loginNeed", "로그인이 필요합니다.", RequestAttributes.SCOPE_REQUEST); return "ch13/content"; } else {

      	Object result = joinPoint.proceed(); 
      	
      	return result;
      }
      

      }

TO-DO

  • Trans관련 AOP 모듈은 10일 진행
⚠️ **GitHub.com Fallback** ⚠️