유디의 공간정보·개발일기
4. 0906_Spring MVC 본문
[복습]
- 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가 출력되며 전체사원목록출력이라는 헤드가 출력됨
'Spring, Mybatis' 카테고리의 다른 글
6. 0908_ Spring MVC(계속) (0) | 2021.09.09 |
---|---|
5. 0907_Spring MVC(계속), Spring까지 같이 사용하기 (0) | 2021.09.07 |
3-2. 0903_ Mybatis개요(계속), SQL RDBMS, DBeaver (1) | 2021.09.03 |
3-1. 0903_ MyBatis 더 알아보기 (0) | 2021.09.03 |
2-3. DBCP를 HikariCP로 변경하기 (0) | 2021.09.02 |