유디의 공간정보·개발일기

4. 0906_Spring MVC 본문

Spring, Mybatis

4. 0906_Spring MVC

55yudi 2021. 9. 6. 17:53

[복습]

- DBCP : 실무에서 많이 사용중

- HikaroCP : 속도가 빠르고 안정적

 

- MyBatis

- ORM프레임워크 (Object–Relational Mapping)


ctrl + alt + h : 메소드명을 클릭하고 이 메소드가 어디에서 호출되는지 확인


[update]

 

- (저번 시간에 이어서) 동적sql의 필요성으로 인한 코드 실습 : 한 컬럼의 값만 변경하려고 한다.

  price만 값을 변경해보려고 한다. 나머지는 null이면 세팅을 안하려고 함 = 동적sql

- 이 sql문은 mapper-product.xml에 태크 형태로 들어가야 한다.

  동적 sql로 안넣고 다음 코드처럼 넣으면

<update id="update" parameterType="myspringmybatis.ProductVO">
		update product 
		set price = #{price}
			maker = #{maker},
			name = #{name}
		where id = #{id}	
	</update>

  update를 실행하고 테이블을 조회했을 때 데이터가 바뀌지 않은 곳의 값이 Null로 떠버리게 된다.

 

- 그래서 이러한 부분때문에 동적 sql을 입력해야 한다.

<update id="update" parameterType="myspringmybatis.ProductVO">
		update product 
		<set>
      	 <if test="price != null">price=#{price},</if>
      	 <if test="name != null">name=#{name},</if>
      	 <if test="maker != null">maker=#{maker}</if>
    	</set>
		where id = #{id}	
	</update>

- ProductMain.java에 update할 변수 값을 적고 실행하면

  잘 반영됐음을 int result값으로 확인할 수 있다.

다시 비버에서 테이블 select 조회해 보면 잘 반영됨!


[select]

 

- ProductMain 복사 --> ProductSelectMain로 생성

package myspringmybatis;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProductSelectMain {

	public static void main(String[] args) throws Exception {
		ApplicationContext context = 
	            new ClassPathXmlApplicationContext("classpath:context-spring-annotation.xml");
		   ProductDAO dao = (ProductDAO) context.getBean("productDAO");
		   ProductVO vo = new ProductVO();
		   
		   // select, id로 검색하는 메서드 --> DAO에 메소드 만들기
		   vo = dao.selectById("2222");
		   System.out.println(vo);
		   
		   
	}

}

- ProductVO에 마우스우클릭 - source - generate toString()

@Override
	public String toString() {
		return "ProductVO [id=" + id + ", price=" + price + ", maker=" + maker + ", name=" + name + "]";
	}

- mapper-product.xml에 코드 추가

<!-- public ProductVO selectById(String id) throws Exception { 를 보고 입력 -->
	<select id="selectById" parameterType="String" resultType="myspringmybatis.ProductVO">
		select id, price, maker, name<!-- 컬럼명과 VO의 변수이름이 달라서 Alias로 지정해야 한다 -->
		from product
		where id = #{id}
	</select>

- 콘솔창에 결과값이 잘 나온다.

 

c.f. context-spring-annotation.xml <bean> 코드 설명

 	<!-- property name은 class마지막 부분 안에 있는 setter 함수 이름 -->
 	 	<!-- ref는 위쪽 bean id와 같아야 한다 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
     <property name="dataSource" ref="dataSource" />
     <property name="mapperLocations" value="classpath*:mapper-*.xml" />
   </bean>
   <!-- 아랫줄 id="sqlSession"은 ProductDAO에 @Autowired 걸리는 부분에 사용된다. -->
   <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
     <constructor-arg index="0" ref="sqlSessionFactory" />
   </bean>

 

c.f. spring Bean Scope

- 스프링은 기본적으로 모든 bean을 singleton으로 생성하여 관리한다.

- 구체적으로는 애플리케이션 구동 시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미

- request, session, global session의 Scope는 일반 Spring 어플리케이션이 아닌, Spring MVC Web Application에서만 사용된다.

출처 : https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

 

c.f. DAO(Data Access Object)

 


Spring MVC

 

Spring Framework

MyBatis Framework처럼

Spring MVC Framework라고 생각하면 된다.

 

- 새 프로젝트 생성 : new project - other - spring legacy project 선택 - 프로젝트명은 myspringmvc

Spring MVC Project 선택 - Next

top-level package 생성 - Finish

생성이 잘 되면 다음과 같은 구조가 생긴다. (구조에 익숙해질 것!)

 

 

c.f. 오류가 생긴다면(희만링 호출)

 


- 서버(톰캣) 연동하기

  Build path - Add library - Server Runtime

톰캣9.0 선택하고 완료하면 잘 완료됨을 볼 수 있다.

서버를 실행시키면 브라우저 결과가 나온다. ( url : http://localhost:9000/team8 )

이클립스 내에서 바로

 

크롬브라우저에서

c.f. 서버연결이 안됐다면:  https://55yudi.tistory.com/2?category=1222249 

 

 

- log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

   <!-- Appenders -->
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
      <param name="Target" value="System.out" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%-5p: %c - %m%n" />
      </layout>
   </appender>
   
   <!-- Application Loggers -->
   <logger name="lx.edu.team8">
      <level value="info" />
   </logger>
   
   <!-- 3rdparty Loggers -->
   <logger name="org.springframework.core">
      <level value="info" />
   </logger>
   
   <logger name="org.springframework.beans">
      <level value="info" />
   </logger>
   
   <logger name="org.springframework.context">
      <level value="info" />
   </logger>

   <logger name="org.springframework.web">
      <level value="debug" />
   </logger>

   <!-- Root Logger -->
   <root>
      <priority value="debug" />
      <appender-ref ref="console" />
   </root>
   
</log4j:configuration>

으아아아 오류오류오류 파티

프로젝트 완전 삭제하고 다시 생성하고 반복,,이씽..

 

- settings.xml 파일을 VS Code에서 열어서 51번째 줄에 폴더 경로설정 코드 수정하고 저장 - 닫기

- 이클립스에서 user settings에서 파일로 경로설정 지정 - apply and close

 

 

- Spring MVC를 쓰기 위해서는 web.xml에 다음 코드가 있어야 한다.

<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

 

- servlet-context.xml에 annotation과 base-package 설정이 있다.

<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />
<context:component-scan base-package="lx.edu.team8" />

 

- ctrl + shift + R : 해당 이름의 파일을 열고 싶을 때

- home.jsp에 두번째 줄 코드 수정

<%@ page session="false" contentType="text/html; charset=UTF-8" %>

- 브라우저를 다시 열면 한글이 잘 반영되어 있다.

 

[메커니즘]

- 클라이언트가 언제 웹 페이지 요청을 할까?
  : 사용자가 링크나 태그를 클릭하면 웹브라우저는 서버에게 요청을 보냄
    주소창에 주소를 입력했을 때도 요청을 보냄
    새로고침 버튼을 누를 때도 요청을 보냄

- 서버측에서 무슨일이 일어나나요?
   변환된 소스파일(여기서는 HomeController)에 해당하는 메서드가 실행되고

   Home.jsp로 대응되어 html에 결과가 나타남


 

- EmpController.java 클래스 생성

package lx.edu.team8;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class EmpController {

	@RequestMapping(value="login-form.do", method=RequestMethod.GET)
    //@RequestMapping("login-form.do")//만 써도 됨
	public String getForm() {
		return "login-form";
	}
}

- views폴더 > jsp파일 생성 : login-form

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Login Form.jsp</h1>
</body>
</html>

서버 실행하면 다음 창이 나타난다.

주소는 http://localhost:9000/team8/login-form.do 입력

 


- 실습하기(과제)

 

myexamspringmvc를 생성합니다.
EmpController
- emp-list.do로 요청하면 
- emp-list.jsp가 출력되며 전체사원목록출력이라는 헤드가 출력됨