데일리로그C:
article thumbnail

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"; }

doE 실행 --> doF forward
doF에서 새로고침하면 flash는 사라짐

 


 

 

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
profile

데일리로그C:

@망밍

포스팅이 도움됐다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!