테이블 생성 & 데이터 삽입
--공통코드
CREATE TABLE COM_CODE(
COM_CODE VARCHAR2(30),
COM_CODE_NM VARCHAR2(150),
CONSTRAINT PK_COM_CODE PRIMARY KEY(COM_CODE)
);
INSERT INTO COM_CODE(COM_CODE, COM_CODE_NM)
VALUES('hobby','취미');
INSERT INTO COM_CODE(COM_CODE, COM_CODE_NM)
VALUES('car','보유 자동차');
INSERT INTO COM_CODE(COM_CODE, COM_CODE_NM)
VALUES('gen','성별');
INSERT INTO COM_CODE(COM_CODE, COM_CODE_NM)
VALUES('natn','국적');
=> 후에 커밋 필수!!
--공통코드상세
CREATE TABLE COM_CODE_DETAIL(
COM_CODE_DETAIL VARCHAR2(30),
COM_CODE_DETAIL_NM VARCHAR2(150),
COM_CODE VARCHAR2(30),
CONSTRAINT PK_CCD PRIMARY KEY(COM_CODE_DETAIL),
CONSTRAINT FK_CCD FOREIGN KEY(COM_CODE)
REFERENCES COM_CODE(COM_CODE)
);
INSERT INTO COM_CODE_DETAIL
VALUES('hobby01','Music','hobby');
INSERT INTO COM_CODE_DETAIL
VALUES('hobby02','FootBall','hobby');
INSERT INTO COM_CODE_DETAIL
VALUES('hobby03','showping','hobby');
INSERT INTO COM_CODE_DETAIL
VALUES('car01','qm5','car');
INSERT INTO COM_CODE_DETAIL
VALUES('car02','sm6','car');
INSERT INTO COM_CODE_DETAIL
VALUES('car03','volvo','car');
INSERT INTO COM_CODE_DETAIL
VALUES('gen01','남성','gen');
INSERT INTO COM_CODE_DETAIL
VALUES('gen02','여성','gen');
INSERT INTO COM_CODE_DETAIL
VALUES('gen03','기타','gen');
INSERT INTO COM_CODE_DETAIL
VALUES('natn01','대한민국','natn');
INSERT INTO COM_CODE_DETAIL
VALUES('natn02','독일','natn');
INSERT INTO COM_CODE_DETAIL
VALUES('natn03','오스트레일리아','natn');
INSERT INTO COM_CODE_DETAIL
VALUES('natn04','캐나다','natn');
=> 후에 커밋 필수!!
SELECT A.COM_CODE, A.COM_CODE_NM,
B.COM_CODE_DETAIL, B.COM_CODE_DETAIL_NM, B.COM_CODE
FROM COM_CODE A, COM_CODE_DETAIL B
WHERE A.COM_CODE = B.COM_CODE;
Mapper 인터페이스
: 매핑 파일에 기재된 SQL를 호출하기 위한 인터페이스
- Mapper 인터페이스 작성 시 해야할 것
1. 반드시 인터페이스로 선언
2. 네임스페이스 명은 패키지 + 인터페이스 이름
3. 메서드명은 SQLID와 동일하게 작성
4. pom.xml에서 버전 확인 및 추가하기
<!-- Database -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- oracle
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency> -->
5. web.xml에 추가하기 (여러개 사용시 콤마로 구분)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml,
/WEB-INF/spring/security-context.xml</param-value>
</context-param>
6. root-context.xml 추가하기
<!-- Mapper 인터페이스 설정
개발자가 직접 DAO를 설정하지 않아도
자동으로 Mapper 인터페이스를 활용하는 객체를 생성하게 됨
.별별. => (중첩된)패키지 하위의 모든 것
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="kr.or.ddit.**.mapper" />
</bean>
실습
ComCodeMapper.java
package kr.or.ddit.mapper;
import kr.or.ddit.vo.ComCodeVO;
public interface ComCodeMapper {
// 국적을 공통코드로부터 가져와보자
public ComCodeVO getComCode(String comCode);
}
ComCodeVO.java
package kr.or.ddit.vo;
import java.util.List;
import lombok.Data;
@Data
public class ComCodeVO {
private String comCode;
private String comCodeNm;
//COM_CODE : COM_CODE_DETAIL = 1 : N
private List<ComCodeDetailVO> comCodeDetailVOList;
}
ComCodeDetailVO.java
package kr.or.ddit.vo;
import lombok.Data;
@Data
public class ComCodeDetailVO {
private String comCodeDetail;
private String comCodeDetailNm;
private String comCode;
}
mybatisAlias.xml
<typeAliases> 안에 추가
<typeAlias type="kr.or.ddit.vo.ComCodeVO" alias="comCodeVO"/>
<typeAlias type="kr.or.ddit.vo.ComCodeDetailVO" alias="comCodeDetailVO"/>
comCode_SQL.xml
mapper의 namespace 이름이 바뀜 -> 패키지명+클래스명 : 매퍼가 직접 찾아가기에 경로로 작성해야 함
ex) kr.or.ddit.mapper.ComCodeMapper
<?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="kr.or.ddit.mapper.ComCodeMapper">
<!-- COM_CODE (1) -->
<resultMap type="comCodeVO" id="comCodeMap">
<result property="comCode" column="COM_CODE"/>
<result property="comCodeNm" column="COM_CODE_NM"/>
<collection property="comCodeDetailVOList" resultMap="comCodeDetailMap"></collection>
</resultMap>
<!-- COM_CODE_DETAIL (N) -->
<resultMap type="comCodeDetailVO" id="comCodeDetailMap">
<result property="comCodeDetail" column="COM_CODE_DETAIL"/>
<result property="comCodeDetailNm" column="COM_CODE_DETAIL_NM"/>
<result property="comCode" column="COM_CODE"/>
</resultMap>
<!-- 국적을 공통코드로부터 가져와보자
public ComCodeVO getComCode(String string);
메소드명이 곧 id가 됨
조인을 했기에 resultMap을 사용
-->
<select id="getComCode" parameterType="String" resultMap="comCodeMap">
SELECT A.COM_CODE, A.COM_CODE_NM
, B.COM_CODE_DETAIL, B.COM_CODE_DETAIL_NM, B.COM_CODE
FROM COM_CODE A, COM_CODE_DETAIL B
WHERE A.COM_CODE = B.COM_CODE
AND A.COM_CODE=#{comCode}
ORDER BY B.COM_CODE_DETAIL
</select>
</mapper>
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.mapper.ComCodeMapper;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.ComCodeVO;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
@Autowired
ComCodeMapper comCodeMapper;
@GetMapping("/registerForm05")
public String registerForm05(@ModelAttribute("user") Member member) {
//11. 셀렉트 박스 요소
//국적 선택
Map<String, String> notionalityCodeMap =
new HashMap<String, String>();
notionalityCodeMap.put("Korea", "대한민국");
notionalityCodeMap.put("Germany", "독일");
notionalityCodeMap.put("Australia", "오스트레일리아");
member.setNotionalityCodeMap(notionalityCodeMap);
//국적 미리 선택
member.setNationality("Korea");
//국적을 공통코드로부터 가져와보자
ComCodeVO comCodeVO = this.comCodeMapper.getComCode("natn");
log.info("registerFOrm05->comCodeVO : " + comCodeVO);
//forwarding
return "registerForm05";
}
}
- jsp로 데이터 보내기
MemberController.java
package kr.or.ddit.controller;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import kr.or.ddit.mapper.ComCodeMapper;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Card;
import kr.or.ddit.vo.ComCodeVO;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
// DI(의존성 주입) / IoC(제어의 역전)
@Autowired
MemberService memberService;
@Autowired
ComCodeMapper comCodeMapper;
@GetMapping("/registerForm05")
public String registerForm05(@ModelAttribute("user") Member member,
Model model) {
//11. 셀렉트 박스 요소
//국적 선택
Map<String, String> notionalityCodeMap =
new HashMap<String, String>();
notionalityCodeMap.put("Korea", "대한민국");
notionalityCodeMap.put("Germany", "독일");
notionalityCodeMap.put("Australia", "오스트레일리아");
member.setNotionalityCodeMap(notionalityCodeMap);
//국적 미리 선택
member.setNationality("Korea");
//국적을 공통코드로부터 가져와보자
ComCodeVO comCodeVO = this.comCodeMapper.getComCode("natn");
log.info("registerFOrm05->comCodeVO : " + comCodeVO);
model.addAttribute("comCodeVO", comCodeVO);
//forwarding
return "registerForm05";
}
}
registerForm05.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<h2>Spring Form</h2>
<!-- modelAttribute 속성에 폼 객체의 속성명을 지정함 -->
<form:form modelAttribute="user" method="post" action="/registerForm01Post">
<p>국적 : (String nationality)
</p>
<!-- 국적을 공통 코드로부터 가져와보자 -->
<select id="nationality" name="nationality">
<c:forEach var="comCodeDetailVO" items="${comCodeVO.comCodeDetailVOList}" varStatus="stat">
<option value="${comCodeDetailVO.comCodeDetail}">${comCodeDetailVO.comCodeDetailNm}</option>
</c:forEach>
</select>
</form:form>
TIP
<설계 3단계>
개념적 설계 : 개체(Entity), 관계(Relationship)설정 후 그린 것까지
논리적 설계 : 개념적 설계 후 속성(Attribute), P.K/F.K제약사항, 정규화 (기본 3정규화까지)
-------------------------------------------설계 완료-------------------------------------------
물리적 설계 : 속성의 영문명, 자료형, 크기, 역정규화
'스프링 프레임워크' 카테고리의 다른 글
[스프링 프레임워크] 24장 페이징 처리 (0) | 2024.05.14 |
---|---|
[스프링 프레임워크] 23장 숨겨진 필드요소, 라벨요소, 입력값 검증 (0) | 2024.05.13 |
[스프링 프레임워크] 21장 스프링 폼 태그 라이브러리 (0) | 2024.05.10 |
[스프링 프레임워크] 20장 모델을 통한 데이터 전달 (0) | 2024.05.09 |
[스프링 프레임워크] 19장 파일업로드 Ajax 방식 요청 처리 (0) | 2024.05.08 |