TIL(2023.10.06)

JAKE·2023년 10월 10일

TIL

목록 보기
41/48
post-thumbnail

🏃‍♂️What I learned

1. root-context

  • 서버 실행 시 처음 읽어 들이는 파일 -> web.xml

  • web.xml의 경로를 타고 servlet-context와 root-context를 읽음

    servlet-context의 역할은 여기

  • root-context :

  1. Bean들이 모인 공간으로 공통 bean을 설정 - 프로젝트 전반적으로 사용되는 자원을 생성 및 설정
  2. view와 관련되지 않은 DB연결정보, 트랜잭션, 파일 업로드 등의 설정을 작성
ex)

<!-- Data Source -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
	<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
	<property name="username" value="project" />
	<property name="password" value="project1234" />
	<property name="defaultAutoCommit" value="false" />
	<property name="initialSize" value="10" /> 
	<property name="maxTotal" value="500" /> 
	<property name="maxIdle" value="100" /> 
	<property name="minIdle" value="10" /> 
	<property name="maxWaitMillis" value="-1" /> 
</bean>

<!-- Mybatis sqlsession 등록 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="configLocation" value="classpath:mybatis-config.xml" />
	<property name="dataSource" ref="dataSource" />
</bean>

<!-- SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 관리 역할을 하는 SqlSession을 생성하는 객체 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg ref="sqlSessionFactoryBean" />
</bean>

<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우 추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
</bean>


2. Mybatis

  • 데이터의 CRUD를 보다 용이하게 하기 위해 도와주는 프레임 워크
  • DAO에 과정에 관여
  • xml로 구조화된 Mapper설정 파일을 통해 JDBC를 구현

** Mybatis 설정

1. 메이븐 라이브러리 추가
- JDBC 드라이버 (ojdbc11)
- Spring에서 JDBC지원하는 모듈 (spring-jdbc)
- Mybatis 라이브러리 (mybatis)
- Spring에서 쉽게 Mybatis를 사용 가능하게 만드는 모듈(spring-mybatis)
- DataBase Connection Pool 사용을 위한 라이브러리(commons-dbcp2)

2. window - preferencies - XML - XML catalog : User Specified Entries클릭 – Add

- Config
Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Config 3.0//EN

- Mapper
Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Mapper 3.0//EN


3. ‘src/main/resources’폴더에 mybatis-config.xml 생성
: XML파일 - 파일 이름 'mybatis-config.xml' 지정 - create file using a DTD or XML Schema file 선택
- select XML Catalog entry에서 Config 선택 - 생성 완료!

4. mybatis-config.xml 작성
- settings : SqlSessionTemplate 설정
- typeAliases : VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여
- mappers : Mapper 파일의 경로 설정
ex)
<!-- SqlSessionTemplate 생성 시 적용될 설정 작성 부분 -->
<settings>
<!-- insert, update에 사용되는 값 중 null이 있을 경우에 대한 설정 
: 해당 설정이 없을 경우 SQL구문에 null 포함되어 있다는 오류 발생. 
해상 설정이 있을 경우 오류를 발생 시키지 않고 NULL 값을 컬럼에 대입 
단, NOT NULL 제약조건이 없는 컬럼에만 가능함. 
** value 설정 시 NULL 은 반드시 대문자로 작성 (소문자 null은 오류가 발생함) -->
	<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<!-- 별칭 작성 부분 -->
<!-- VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여 -->
<typeAliases>
	<typeAlias type="edu.kh.project.member.model.dto.Member" alias="Member" />
</typeAliases>
<!-- mapper 파일(SQL 작성되는파일) 위치 등록 부분 -->
<mappers>
	<mapper resource="/mappers/member-mapper.xml" />
	<mapper resource="/mappers/ajax-mapper.xml" />
	<mapper resource="/mappers/email-mapper.xml" />
</mappers>

3. 자주쓰는 어노테이션 정리

  1. @Controller : 컨트롤러 클래스임을 명시 + bean 등록
  2. @Service : 서비스 클래스임을 명시(* 인터페이스 사용시 Impl클래스에 작성) + bean 등록
  3. @Repository : DB관련 클래스임을 명시 + bean 등록

  4. @Autowired : Bean으로 등록된 객체 중 타입이 일치하는 bean을 자동 주입

  5. @RequestMapping("/") : 요청주소가 "/"인 경우 이 메서드로 연결(디폴트 = get)
  6. @GetMapping("") : post 방식 요청을 연결
  7. @PostMapping("") : get 방식 요청을 연결

  8. @ResponseBody : controller의 결과를 브라우저로 반환 + Java데이터를 JSON,TEXT로 자동 변환

  9. @SessionAttributes({"키값"}) : model에 작선된 값과, 어노테이션"키값"이 같으면 해당 데이터를 session scope로 이동

  10. @ModelAttribute : 전달받은 name 속성값 = DTO 필드명 같을 때 사용(자동 setter)
  11. @RequestHeader : 요청 HTTP header에서 이전 주소 값을 얻어옴
  12. @RequestParam(value = "", required = "false")
    : value = name 속성값
    : required가 true면 null 불허, false면 null 허용

  13. @Transactional : 예외발생 시 자동 롤백
  14. (tx:annotation-driven transaction-manager="transactionManager"태그 servlet-context에 추가 필수)
  15. @ExceptionHandler(예외명.class) : 현재 클래스에서 발생하는 예외 처리
  16. @ControllerAdvice : @Controller가 붙은 모든 클래스에서 예외를 잡아줌

스프링에서 예외 처리 방법

  • 1순위 : 메서드 단위로 처리 -> try, catch / throws
  • 2순위 : 클래스 단위로 처리 -> @ExceptionHandler
  • 3순위 : 프로그램 단위(전역) -> @ControllerAdvice

0개의 댓글