AC 02/07 Spring

Bae Seong Jun·2024년 2월 7일

Acorn academy

목록 보기
45/70

@Alias()

dto 클래스의 별칭 지정해주는 어노테이션

새로운 세션

전에 쓰던거 session => sql session template
다른 점 따로 close()를 안해줘도 된다.
또한 template의 기능 업그레이드 버전인 MyBatis를 사용할 수 있다.

기존 mybatis 설정

config.xml

properties 로딩 => alias설정 => 4가지 정보설정 => 맵퍼 등록 => MySqlSessionFactory xml 로딩 => getSqlSession : SqlSession 리턴 사용

스프링 설정

properties 로딩 => 4가지 정보 이용 DataSource생성 =>
SqlSessionFactoryBean(생성): 맵퍼등록, dto클래스 위치지정, DataSource 사용

SqlSessionTemplate 빈생성 : SqlSessionFactoryBean 사용

dao : SqlSessionTemplate빈 실제 사용

실제 사용

코드가 스프링을 사용하지 않을 때에 비해서 많이 간소해졌다.
dml문에 필요한 commit문이 필요하지 않고
close문 또한 필요하지 않게 되었다.

config.xml 코드 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 0. 어노테이션 활성화 -->
	<context:annotation-config></context:annotation-config>
	
	<!-- 1. properties 등록 -->
	<context:property-placeholder location="classpath:com/config/jdbc.properties"/>
	
	<!-- 2. DataSource 생성 -->
	<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="${jdbc.driver}"></property>
	    <property name="url" value="${jdbc.url}"></property>
	    <property name="username" value="${jdbc.userid}"></property>
	    <property name="password" value="${jdbc.passwd}"></property>
	</bean>
	
	<!-- 3. SqlSessionFactoryBean 생성, DataSource, mapper저장, alias지정 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="mySqlSessionFactory">
		<property name="dataSource" ref="myDataSource"></property>
		<property name="mapperLocations"> <!-- mapper설정 -->
			<list>
				<value>classpath:com/config/DeptMapper.xml</value>
			</list>
		</property>
		<property name="typeAliases">
			<list>
				<value>com.dto.DeptDTO</value> <!-- dto클래스에서 alias명을 지정 @Alias("alias명") -->
			</list>
		</property>
	</bean> 
	
	<!-- 4. 마지막 SqlSessionTemplate 생성, SqlSession과 동일한 기능 실제 dao에서 사용할 객체 -->
	<bean id="mySqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="mySqlSessionFactory"></constructor-arg>
	</bean>
	
	<!-- dao, service 등 필요한 곳에서 자동주입받음, 또는 명시적 주입 -->

</beans>

DeptDAO.java

package com.dao;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import com.dto.DeptDTO;

public class DeptDAO {

	@Autowired
	SqlSessionTemplate session; //기존의 SqlSession과 동일

	public SqlSessionTemplate getSession() {
		return session;
	}
	public void setSession(SqlSessionTemplate session) {
		this.session = session;
	}

	
	public List<DeptDTO> select() {
		return session.selectList("selectAll");
	}

	public int insert(DeptDTO dto) {
		return session.insert("insert", dto);
	}
	public void update(DeptDTO dto) {
		session.update("update", dto);
	}
	public int delete(int i) {
		return session.delete("delete", i);
	}
}

DeptService.java

package com.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.dao.DeptDAO;
import com.dto.DeptDTO;

public class DeptService {

	@Autowired
	DeptDAO dao;

	public DeptDAO getDao() {
		return dao;
	}

	public void setDao(DeptDAO dao) {
		this.dao = dao;
	}

	public DeptService() {
		super();
		// TODO Auto-generated constructor stub
	}

	public List<DeptDTO> select() {
		return dao.select();
	}

	public int add(DeptDTO dto) {
		return dao.insert(dto);
	}

	public void update(DeptDTO dto) {
		dao.update(dto);
	}

	public int delete(int i) {
		return dao.delete(i);
	}
}

DeptMain.java

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.dto.DeptDTO;
import com.service.DeptService;

public class DeptMain {
	public static void main(String[] args) {
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/config/dept.xml");
//		SqlSessionTemplate session = ctx.getBean("mySqlSessionTemplate", SqlSessionTemplate.class);
//		System.out.println(session);
		
		DeptService service = ctx.getBean("deptService", DeptService.class);
		
//		DeptDTO xx = new DeptDTO(99, "영업", "제주");
//		int n = service.add(xx);
//		System.out.println(n);
		
		service.update(new DeptDTO(99, "aa", "aa"));
		int n2 = service.delete(99); System.out.println(n2);
		
		List<DeptDTO> list = service.select();
		for (DeptDTO d : list) {
			System.out.println(d);
		}
	}
}

기존 mvc패턴

form=>servlet : 파싱, db연동, 출력용데이터
폼데이터 파싱에 getParameter, getParameterValues 2가지 함수를 제공함

=> jsp전송, jsp 출력 처리
환경설정 : web.xml

spring

스프링은 mvc패턴을 무조건 사용함
form => controller가 처리(/login => 함수에서 처리)
폼데이터 파싱에 다양한 방법을 제공함

=> jsp위임 출력처리
환경설정 : web.xml을 쓰고 => root-context.xml(db설정, 기타 필요한 빈생성) ,
servlet-context.xml (controller설정)
2가지를 추가로 사용

프로젝트 생성

new -> spring Legacy Project -> speing mvc project 선택하고 이름입력
top-level package 설정 : 최소 3번ㅇ은 들어가야함
마지막 패키지명이 주소가 됨 (중요)

pom.xml 수정해야함
<artifactId>app</artifactId> <!-- context 주소, 하지만 수정한다고 바뀌지는 않음 -->

자바버전 11

스프링버전 4.3.22.릴리즈

home을 바로 찾아갈 수 있는 이유 : servlet-context.xml에서 ViewResolver가 처리해줘서


@RequestMapping("/")으로 주소 처리

WEB-INF/spring/appServlet/serclet-context.xml에 있는
인터날 리소스뷰 리졸버로 "/WEB-INF/views/" 가 앞에, ".jsp"가 뒤에 자동으로 붙음

프론트 파일은 위의 경로에 무조건 위치해야함.

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller			//bean생성 등록 피요함  Servlet-context.xml
public class TestController {

	public TestController() {
		super();
		System.out.println("controller 기본생성자 호출");
	}
	// "/test_1/"처리
	@RequestMapping("/")
	public String main() { //servlet과 동일
		System.out.println("/ 주소 요청됨");
		return "/WEB-INF/views/aaa.jsp"; //응답처리할 jsp 파일 이름 aaa.jsp
	}
	
	@RequestMapping("/kkk")
	public String kkk() { //servlet과 동일
		System.out.println("/kkk 요청=====================");
		return "/WEB-INF/views/hello.jsp"; //응답처리할 jsp 파일 이름 aaa.jsp
	}
	
	@RequestMapping("/kkk2")
	public String kkk2() {
		System.out.println("/kkk2 요청===============");
		return "/WEB-INF/views/home.jsp";
	}
}

특징

  • 스프링은 항상 MVC패턴으로 통해 요청되고 응답한다.
    - JSP를 직접 요청이 불가능
    - jsp에서 jsp로도 직접 요청이 불가능하다.
    - 모든 요청은 controller에 가능
    • @RequestMapping("/aaa") 해당 주소로 controller를 요청
    • return "xxx"; 리턴값이 응답할 JSP의 파일명.
    • JSP는 /WEB-INF/spring/views/에 존재해야한다.
    • servlet-context.xml에서 resolver를 통해 위 기본 경로를 수식어로 항상 달아준다.

@RequestMapping(value="/login", method=RequestMethod.GET)
이런 식으로 서브밋의 GET/POST를 제한할 수 있다.
또한 만약 아래와 같이 같은 주소에 다른 2개의 함수를 만들고 각각 GET/POST를 다르게 제한을 준다면 GET요청시 GET제한이 걸린 함수로 이동하고, POST요청시 POST제한이 걸린 함수로 이동한다.
마치, 오버로딩과 비슷한 느낌의 작동방식이다.

profile
코딩 프로?

0개의 댓글