메소드를 먼저 만들고 어노테이션을 쓰자
@GetMapping("/product2")
public String product2(@ModelAttribute(name="vo") ProductVO vo) {
LOGGER.info("product2() 호출");
return "product-result";
}
@modelAttribute()
를 쓰면 ProductVO vo=new ProductVO(name, price);
를 안해도 부를때마다 객체를 생성함. 매개변수있는 생성자 호출
스프링에서는 클라이언트에서 보내는 parameter 이름과 vo의 변수명은 모두 똑같아야한다.
싱글톤형태는 아님. 데이터가 갱신이 되어야해서 객체를 생성하는것.
데이터를 클라이언트에서 서버로 보내는 방식은 parameter뿐만 아니라 json형태로도 가능하다.
스프링에서 json형태로 데이터를 전송할 때 사용하는 어노테이션.
@GetMapping("/json2")
@ResponseBody
public String json2() {
LOGGER.info("json2() 호출");
return "Hello, Spring";
}
지금까진 return 값이 jsp를 돌려주면서 jsp파일을 호출했는데 @ResponseBody
를 사용하면 jsp파일이 호출되는게 아니라 String 값을 돌려주는 것.
ajax 비동기방식에 데이터만 돌려줄 때 주로 사용된다.
@GetMapping("/json3")
@ResponseBody
public ProductVO json3() {
LOGGER.info("json3() 호출");
return new ProductVO("야구공", 10000);
}
vo를 return하게 되면 {"name":"야구공","price":10000}
형태의 데이터가 프론트사이드에 전송된다
자동으로 json의 key-value형태로 파싱되어 전송됨.
스프링 MVC는 웹애플리케이션을 쉽고 빠르게 개발할 수있도록 도와준다.
xml, jsp, java 등 프로젝트 안에있는 모든 소스파일들은 전부 bytecode로 바뀌어서 구동된다.
그래서 xml에서 하던 설정이 java에서도 설정할 수 있고 왔다갔다가 가능함
그냥 구역을 나누어놓은 약속일뿐
새로운 프로젝트를 만들었다면 pom.xml->web.xml->root-context.xml->servlet-context.xml
순으로 설정 적용해주기
pom.xml에서 버전을 변경했는데 maven에 적용되지않았다면
프로젝트->maven->update project
pom.xml의 버전 변경 따라하기
<!-- jdbc 라이브러리 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
</dependency>
<!-- MyBatis 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
mybatis-spring 라이브러리
<!-- mybatis-spring 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
spring-jdbc 라이브러리
<!-- spring-jdbc 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
설정을 다 했는데 404가 뜬 경우
1. 프로젝트가 서버에 add되어있는지 확인하기
root-context.xml에서 <beans>
는 설정관련된 것을 모아놓은 객체라고 볼 수 있다.
<beans>
덮어쓰기<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean>
추가하기 - DataSource 설정<bean id="ds" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="dataSourceName" value="ds"></property>
<property name="URL" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="user" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
<bean>
추가하기 - SqlSessionFactory 설정classpath
는 src/main/resources
를 의미한다.<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds" />
<property name="configLocation" value="classpath:/mybatis-config.xml" />
<property name="mapperLocations" value="classpath:mappers/*.xml" />
</bean>
src/main/resources
에서mybatis-config.xml
파일 생성.
기존에 java에서 사용한 db관련 상수들을 이 파일에서 매핑한다.<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- DB 테이블과 컬럼들을 mapper 매핑을 위한 변수 선언 --> </configuration>
mappers
폴더 생성하고 프로젝트 관련 xml파일 만들기
나는 게시판을 만들 예정이기때문에board-mapper.xml
생성. 여기에는 쿼리랑 controller나 bean같은 전체적인 객체를 설정한다.<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="edu.spring.ex02.BoardMapper"></mapper>
namespace
: 주로 DAO 클래스의 sqlSession과 연결하기 위한 키로 사용함
<bean>
추가하기 - SqlSession 설정<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
@Component
로 등록된 클래스들을 bean으로 생성해서 관리함.<context:component-scan base-package="edu.spring.ex02"></context:component-scan>
댓글 테이블과 게시판 테이블이 있으면 댓글테이블에 데이터가 추가될 경우 게시판 테이블의 댓글수 컬럼도 자동으로 숫자가 변경되어야함.
데이터 insert 시 연결된 시퀀스가 쿼리에 nextval을 포함하지 않아도 자동으로 시퀀스가 수행되게함.
이런 데이터 연결을 자동으로 해주는게 트리거. 트리거를 쓰면 약간의 시간차이가 있을 수 있다
create or replace trigger test_board_bno_trigger
before insert on test_board
for each row
begin
select test_board_seq.nextval into :new.bno from dual;
end;
create or replace trigger test_board_cdate_trigger
before update of title, content on test_board
for each row
begin
select sysdate into :new.cdate from dual;
end;
DB테이블과 컬럼명이랑 매핑하여 사용하기 위해 변수를 선언함
<properties>
<property name="test_board" value="test_board"/>
<property name="bno" value="bno"/>
<property name="title" value="title"/>
<property name="content" value="content"/>
<property name="userid" value="userid"/>
<property name="cdate" value="cdate"/>
<property name="reply_count" value="reply_count"/>
</properties>
mapper안에는 DB쿼리 작성
id
: 주로 DAO 클래스의 sqlSession의 함수와 연결하기 위해 사용함. 1:1 매칭
${key 이름}
: mybatis-config.xml
의 property의 name과 매칭된다. DB 테이블의 열에 해당.
#{key 이름}
: DAO 클래스의 sqlSession에서 전송받은 데이터를 의미한다.(입력데이터 쿼리의 ?부분)
VO에서 getter/setter를 사용해서 데이터를 가져온다.
VO랑 DB의 이름을 연결해주기 위해서 사용하는 key 이름
<insert>
, <select>
, <update>
, <delete>
다음주 예고
단위 테스트. 서버가 없어도 Mapper-MyBatis ↔ DB 간의 동작을 테스트할 수 있음...
spring으로 mvc 게시판을 만들어보기 위한 대장정..🤪