반응형

 

테이블 생성 & 데이터 삽입

 

 

--공통코드
CREATE TABLE COM_CODE(
    COM_CODE VARCHAR2(30),
    COM_CODE_NM VARCHAR2(150),
    CONSTRAINT PK_COM_CODE PRIMARY KEY(COM_CODE)
);

 

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)
);

 

COM_CODE_DETAIL 설명

 

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;

 

결과 화면1

 

 

 

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

 

결과 화면2

 

 

 

  • 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>

 

결과 화면3

 

 

 

TIP

 

 

<설계 3단계>

 

개념적 설계 : 개체(Entity), 관계(Relationship)설정 후 그린 것까지
논리적 설계 : 개념적 설계 후 속성(Attribute), P.K/F.K제약사항, 정규화 (기본 3정규화까지)
-------------------------------------------설계 완료-------------------------------------------
물리적 설계 : 속성의 영문명, 자료형, 크기, 역정규화

 

 

반응형