본문 바로가기
수업내용

20230619 수업내용🙌🙌🙌

by titlejjk 2023. 6. 19.

 

 

다시 Spirng 수업

새로운 프로젝트를 만들어주고 먼저 Oracle DB를 이클립스로 연결해보겠다.

이클립스 window에 Eclipse Marketplace를 열고 mybasit를 검색해주고 제일 상단을 install해준다.

 

여기에 다음과 같은 코드를 추가해주었다.

   <!-- 
      JNDI 데이터 소스 객체 얻어오는 설정   
      Servers/context.xml 에 설정된 oracle 접속정보 가 있어야 된다. 
       
      <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
              username="scott" password="tiger" maxTotal="20" maxIdle="10"
              maxWaitMillis="-1"/>          
   -->
   
   <beans:bean id="dataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean">
      <beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/>
   </beans:bean>
   
   <!-- 
      위는 아래의 코드와 같다
      dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/myoracle");
    -->
   
   
   <!-- 
      SqlSessionFactory 객체 
      Configuration.xml 문서가 어디에 있는지 알려야 한다. 
      value 에서 classpath: 은  src/main/resources 폴더를 가리킨다. 
      따라서  classpath:Configuration.xml 은  src/main/resources 폴더안에 존재 해야 한다. 
   -->
   <beans:bean id="sessionFactory" 
      class="org.mybatis.spring.SqlSessionFactoryBean">
      <beans:property name="dataSource" ref="dataSource"/>
      <beans:property name="configLocation" value="classpath:Configuration.xml"/>
   </beans:bean>
   <!-- 
      sessionFactory=new SqlSessionFactoryBean();
      sessionFactory.setDataSource(dataSource);
      sessionFactory.setConfigLocation("classpath:Configuration.xml");
    -->
   

   <!-- 
      SqlSession 인터페이스를 구현한 
      SqlSessionTemplate(SqlSession) 객체 
      Dao 가 의존하는 객체 
   -->
   <beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
      <beans:constructor-arg name="sqlSessionFactory" 
         ref="sessionFactory"/>
   </beans:bean>
   
   
   
   <!-- 
      위의 bean 설정을 java code 로 환산 하면 아래와 같다 
      
      dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/myoracle");
      
      sessionFactory=new SqlSessionFactoryBean();
      sessionFactory.setDataSource(dataSource);
      sessionFactory.setConfigLocation("classpath:xxx");
      
      new SqlSessionTemplate(sessionFactory);
    -->

Spring 프레임워크를 사용하는 근본적인 이유는

프로젝트의 규모가 큰 경우에 유지 보수를 편하게 하기 위해서 사용한다.

클래스(객체들)들 간에 의존 관계가 느슨해야 유지 보수가 편하다. 어떠헥 해야 의존 관계가 느슨해 지는걸까?

  1. 필요한 핵심의존 객체를 직접 생성하지 않고 주입 받아서 사용한다.
  2. 객체의 생성과 관리를 spring프레임워크에 맡긴다.
  3. 인터페이스 type을 적극 활용한다.

객체 생성과 관리를 Spring에게 맡긴다. 이렇게 하면 의존 관계가 느슨해진다.

<beans:bean id="dataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean">
      <beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/>
   </beans:bean>
   
   <!-- 
      위는 아래의 코드와 같다
      dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/myoracle");
    -->

Configuration.xml 은 sqlSessionFactoryBean에서 읽어 들이고 이 읽어 들인 sqlSessionFactoryBean은 sessionFactory로 들어가게 된다.

java class가 아닌 인터페이스로..

새로운 패키지 두개를 만들어준다. dao와 dto 에 각각 클래스도 만들어주고 지난 시간과는 다르게 구현 클래스도 만들어주겠다.

insert문 먼저 작성해보겠다.

그런다음 MemberMapper.xml 로가서 다음과 같이 코드를 작성해준다.

<?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="member">
	<insert id="insert" parameterType="com.gura.spring02.member.dto.MemberDto">
		INSERT INTO member
		(num, name, addr)
		VALUES (member_seq.NEXTVAL, #{name}, #{addr})
	</insert>
</mapper>

parameterType은 full package 경로를 적어주어야 한다.

#{name}, #{addr}은 MemberDto에 있는 name과 addr을 알아서 바인딩 해달라는 뜻이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/views/member/insertform.jsp</title>
</head>
<body>
	<div class="container">
		<h1>회원 추가 폼 입니다.</h1>
		<form action="${pageContext.request.contextPath }/member/insert" method = "post">
			<div>
				<label for="name">이름</label>
				<input type="text" name = "name" id = "name"/>
			</div>
			<div>
				<label for="addr">주소</label>
				<input type="text" name = "addr" id = "addr" />
			</div>
			<button type = "submit">추가</button>
		</form>
	</div>
</body>
</html>

@Autowired
	private MemberDao dao;
	//회원추가 요청처리
	@RequestMapping("/member/insert")
	public String insert(MemberDto dto) {
		//MemberDao 객체를 이용해서 DB에 저장
		dao.insert(dto);
		//view page로 forward 이동해서 응답
		return "member/insert";
	}

회원목록을 return해주는 메소드

SELECT할 칼럼의 이름이 해당 DTO의 필드 명과 같아야 한다.

//회원 목록 보기 요청 처리
	@RequestMapping("/member/list")
	public String list(HttpServletRequest request) {
		//회원목록을 얻어와서
		List<MemberDto> list = dao.getList();
		//request scope에 담고
		request.setAttribute("list", list);
		// /WEB_INF/views/member/list.jsp페이지로 forward이동해서 응답
		return "member/list";
	}

 

댓글