1. 페이지 이동(get 방식)
(mvc2 response.sendredirect()와 동일 )
ex) return "redirect:/bbs/list"
<bash />
@RequestMapping("doE")
public String doeGet() {
logger.info("doE");
//return "doF"; doE 페이지에서 doF찾음
return "redirect:doF"; // doE로 들어가지만 doF페이지 뜸
}
@RequestMapping("doF")
public String dofGet() {
logger.info("doF");
return "doF";
}
ㄴ> doE로 들어갔지만 forward 되는건 doF임
2. get방식 변수 전달
ㄴ> 주소?변수="값"
1. 어노테이션 사용(변수 1~2개라면 추천)
<bash />
@RequestMapping("doF")
public String dofGet(@ModelAttribute("str") String str) { //어노테이션을 이용한 변수 전달
logger.info("doF===str:"+str);
//어노테이션은 따로 적는 문구 없음
return "index";
}

2. Model 객체 생성(변수가 여러개라면 추천)
<bash />
@RequestMapping("doF")
public String dofGet(Model model) { // Model 객체 사용한 경우
logger.info("doF===str:"+str);
String id = "1111";
String pass ="2222";
model.addAttribute("str", str);
model.addAttribute("id", id);
model.addAttribute("pass", pass);
return "index";
}

3. RedirectAttributes rttr
ㄴ> return "redirect:doF?str="+str 와 같이 ?변수="+값+" 형식으로 전달하는 것을 대신함
rttr.addFlashAttribute
ㄴ> 한번만 전달(@ModelAttribute()를 이용해야 가능)
ㄴ> 주소창에 안보이게 숨김
ㄴ> alert 한번만 뜸(새로고침하면 안뜸)
rttr.addAttribute
<bash />
@RequestMapping("doE")
public String doeGet(RedirectAttributes rttr) {
String str ="abcd";
logger.info("doE");
rttr.addFlashAttribute("id2",str); // 숨겨서 한번만 값 전달
rttr.addAttribute("str2", str); // 숫자, 문자 등 전달
return "redirect:doF";
}
@RequestMapping("doF")
public String dofGet(@ModelAttribute("id2") String id2, String str2, Model model) {
//model.addAttribute("id2", id2);
model.addAttribute("str2", str2);
logger.info("doF===id2:"+id2);
logger.info("doF===str2:"+str2);
return "index";
}




4. JSON
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
ㄴ> { "key": value, "key":value} 형식임
ㄴ> pom.xml 에 <dependency> 추가
ㄴ> SimpleController.java 에 test 추가
ㄴ> 크롬 F12 network에서 확인 (크롬에서 F12 -> network -> ctrl + R)

* controller 안에서 json 처리하고 싶을 땐 : @ResponseBody 이용
WEB : 작성된 html 페이지 등을 네트워크망에 종속되지 않고, 웹서비스를 할 수 있도록 어플리케이션
WAS(Web Application Server) : 웹 서버 + 웹 컨테이너
5. Member
org.zerock.controller : controller --> class 생성
org.zerock.domain : model --> class 생성
ㄴ> MemberVO
ㄴ> ProductVO
org.zerock.persistence : dao, java --> interface 생성
1. db table 생성
<bash />create table tbl_member ( userid varchar(50) not null, userpw varchar(50) not null, username varchar(50) not null, email varchar(100) not null, primary key(userid) );
2. src/main/java 에 패키지 생성
ㄴ> org.zerock.domain
ㄴ> org.zerock.persistence
3. MemberVO.java 생성 --> model
<bash />package org.zerock.domain; import lombok.Data; @Data public class MemberVO { private String userid; private String userpw; private String username; private String email; }
4. MemberDAO.java
<bash />package org.zerock.persistence; import org.zerock.domain.MemberVO; public interface MemberDAO { public String getTime(); //년월일 시분초 public void insertMember(MemberVO vo); //회원가입 }
5. src/main/resources 에 패키지 생성
ㄴ> mappers
6. memberMapper.xml
ㄴ> tag 로 이뤄져있음
* xml 에서 # : 변수임 (mvc2 에서는 $ 썼던것과 동일)
<bash />
<?xml version="1.0" encoding="UTF-8"?>
<!-- db와 관련된 xml 파일임을 인식하기 위해 3줄 필요 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace : member table의 이름 임의로 정함 -->
<mapper namespace="org.zerock.mapper.MemberMapper">
<select id="getTime" resultType="string"> <!-- string 타입으로 결과값을 반환하겠다 : resultType -->
select now()
</select>
<insert id="insertMember">
insert into tbl_member (userid, userpw, username, email) values (#{userid}, #{userpw}, #{username}, #{email})
</insert>
</mapper>

7. root-context.xml 추가 구문
<bash />
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
</bean>
<!-- sql 실제 구문 연동 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
8. MemberDAOImpl.java --> implements
<bash />
package org.zerock.persistence;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import org.zerock.domain.MemberVO;
public class MemberDAOImpl implements MemberDAO {
@Inject
private SqlSession sqlSession; // root-context.xml 에 있음
private static final String namespace="org.zerock.mapper.MemberMapper"; // mapper 매칭(해당 Mapper.xml에서 가져오기)
@Override
public String getTime() {
return sqlSession.selectOne(namespace+".getTime"); // 변수 + "문자열" (Mapper.xml에 아이디가 getTime은 것을 반환해라) 한건의 데이터 반환: selectOne(while이 아닌 if 쓰는 경우와 동일)
}
@Override
public void insertMember(MemberVO vo) { // 4개의 변수를 vo 객체에 담았음 vo.변수 xxx(내부적으로 알아서 인식하기 때문)
sqlSession.insert(namespace+".insertMember",vo); // 매개변수를 받았으니 vo 객체 전달해야함
}
}
9. root-context.xml 추가 구문(스프링에 빈으로 등록)
<bash />
<context:component-scan base-package="org.zerock.persistence"></context:component-scan>
10. MemberDAOImpl.java
어노테이션 추가 @Repository
<bash />
package org.zerock.persistence;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import org.zerock.domain.MemberVO;
//DAO 를 스프링에 인식시켜 주기 위해서 @Repository 사용(상속받는 애한테 꼭 해줘야함)
@Repository
public class MemberDAOImpl implements MemberDAO {
@Inject
private SqlSession sqlSession; // root-context.xml 에 있음
private static final String namespace="org.zerock.mapper.MemberMapper"; // mapper 매칭(해당 Mapper.xml에서 가져오기)
@Override
public String getTime() {
return sqlSession.selectOne(namespace+".getTime"); // 변수 + "문자열" (Mapper.xml에 아이디가 getTime은 것을 반환해라) 한건의 데이터 반환: selectOne(while이 아닌 if 쓰는 경우와 동일)
}
@Override
public void insertMember(MemberVO vo) { // 4개의 변수를 vo 객체에 담았음 vo.변수 xxx(내부적으로 알아서 인식하기 때문)
sqlSession.insert(namespace+".insertMember",vo); // 매개변수를 받았으니 vo 객체 전달해야함
}
}
11. MemberDAOTest.java
1) getTime()
<bash />
package org.zerock.controller;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.MemberVO;
import org.zerock.persistence.MemberDAO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class MemberDAOTest {
@Inject
private MemberDAO dao; //인터페이스(부모)
@Test
public void testTime() throws Exception{ //jnuit
System.out.println(dao.getTime());
}
}
junit test

2) insertMember
<bash />
package org.zerock.controller;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.MemberVO;
import org.zerock.persistence.MemberDAO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class MemberDAOTest {
@Inject
private MemberDAO dao; //인터페이스(부모)
@Test
public void testInsertMember() throws Exception{ // throws exception 예외 발생해도 무시하고 실행해라(try-catch구문과 같음)
MemberVO vo = new MemberVO();
vo.setUserid("3333");
vo.setUserpw("3333");
vo.setUsername("moon");
vo.setEmail("moon@nnnn.com");
dao.insertMember(vo); //회원가입 - 데이타베이스 확인
}
}
junit test

스프링에서는 무조건 변수명 칼럼명과 동일하게 할 것
★ spring MVC 패턴 ★
--------DB ---------
mapper
ㄴ> mapper
ㄴ> xml
persistence
ㄴ> DAO
ㄴ> JAVA
service
ㄴ> controller
ㄴ> jsp
---------------------
inject 순서 : controller -> service -> dao -> persistence > root-context -> mapper
return 순서 : 반대로
인터페이스 --> 상속
변수 or 객체 하나만 전달해야함
여러개가 있다면 map을 이용
'JAVA > spring' 카테고리의 다른 글
스프링 Board 구현_넘버링, 검색 (0) | 2023.05.03 |
---|---|
스프링 Board 구현_예외처리, 페이징 (1) | 2023.05.02 |
스프링 Board 구현 (0) | 2023.04.28 |
스프링 프로젝트 생성 (0) | 2023.04.27 |
스프링 설치 및 설정 (0) | 2023.04.27 |