이번글에서는 간단히 유튜브 영상을 뛰우는 방법에 대해서 적어보도록 하겠다.
이번에는 추가적인 설정이 필요하다.
root-context.xml에 들어가서
중간에 mapper.xml파일과 conpig.xml파일을 등록해준다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis/config.xml" />
<property name="mapperLocations">
<list>
<value>classpath:mybatis/test-mapper.xml</value>
<value>classpath:mybatis/Youtube-mapper.xml</value>
</list>
</property>
</bean>
pom.xml의 dependency에
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.1</version>
</dependency>
이 두가지를 추가해주
Mybatis를 사용하기 때문에 Java Resources > src/main/resources > mybatis라는 폴더를 만들고
config.xml과 xxxx-mapper.xml파일을 만들어준다.
config.xml에는
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
</settings>
<typeAliases>
<typeAlias type="com.itbank.model.TestDTO" alias="test" />
<typeAlias type="com.itbank.model.YoutubeDTO" alias="youtube" />
</typeAliases>
</configuration>
DTO의 약어를 정할수 있다. 만약 typeAliases로 DTO의 약어를 지정해 주지 않는다면
다음에 나올 Mapper에서 Sql문의 결과값의 타입을 지정할때 impot문을 전부 적어줘야한다.
그것을 여기서 미리 지정해 주고 DTO를 youtube만 적는걸로 사용할 수 있다.
package com.itbank.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itbank.model.TestDTO;
import com.itbank.model.YoutubeDTO;
import com.itbank.testService.YoutubeService;
@Controller
@RequestMapping("/youtube")
public class YoutubeController {
@Autowired private YoutubeService youtubeService;
@GetMapping("/list")
public ModelAndView list(){
ModelAndView mav = new ModelAndView();
List<TestDTO> list = youtubeService.selectList();
mav.addObject("list",list);
return mav;
}
@GetMapping("/add")
public void add() {}
@PostMapping("/add")
public String add(YoutubeDTO dto) {
int row = youtubeService.insert(dto);
System.out.println(row + "행이 추가되었습니다");
return "redirect:/youtube/list";
}
@GetMapping("/view/{idx}")
public ModelAndView view(@PathVariable("idx") int idx) {
ModelAndView mav = new ModelAndView("youtube/view");
YoutubeDTO dto = youtubeService.selectOne(idx);
mav.addObject("dto",dto);
return mav;
}
@GetMapping("/delete/{idx}")
public String delete(@PathVariable("idx") int idx) {
int row = youtubeService.delete(idx);
System.out.println(row + "행이 삭제되었습니다");
return "redirect:/youtube/list";
}
@GetMapping("/modify/{idx}")
public ModelAndView modify(@PathVariable("idx") int idx) {
ModelAndView mav = new ModelAndView("youtube/modify");
YoutubeDTO dto = youtubeService.selectOne(idx);
mav.addObject("dto",dto);
return mav;
}
@PostMapping("/modify/{idx}")
public String modify(YoutubeDTO dto) {
int row = youtubeService.update(dto);
System.out.println(row + "행이 수정되었습니다");
return "redirect:/youtube/list";
}
}
Controller을 보면 list메서드가 있다. 이건 영상목록을 뛰우는 메서드이다.
우선 SQL문으로 Select로 받아온 메서드는 ModelAndView가 필요하니 만들어주고
많은 객체를 받아오기 위해서 List를 선언한다.
그리고 파라미터를 보내기 위해서 mav.addObject에 추가시켜준다.
add에서 @Getmappgin과 @PostMapping을 둘다 선언해주고 @PostMappring으로 jsp파일의 form태그로 보낸 파라미터를 받아서 @Service로 보낸다.
그리고 redirect로 원하는 jsp페이지로 돌아간다.
view는 하나의 영상목록을 눌렀을 때 그 idx를 @Getmapping으로 그 idx의 view페이지와 매핑하고 @PathVariable로
int idx에 그 파라미터값을 넣는다.
그리고 똑같이 ModelAndView를 만들어주고 Service로 idx를 보낸다.
그렇게 dao를 거쳐서 DB를 가져온 다음 DTO의 변수에 값이 들어가고 그 값들을 가져오는 것이다.
modify는 같은 원리 이지만 다른점은 @GetMapping 에서는 idx만을 받아 service로 보내서
그 idx에 해당하는 정보들을 불러온다.
@PostMapping에서는 jsp페이지에서 보낸 값들을 받아서 update메서드를 실행시켜서 DB에 데이터를 추가한다.
package com.itbank.testService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.itbank.model.TestDTO;
import com.itbank.model.YoutubeDTO;
import com.itbank.repository.YoutubeDAO;
@Service
public class YoutubeService {
@Autowired private YoutubeDAO dao;
public List<TestDTO> selectList() {
return dao.selectList();
}
public int insert(YoutubeDTO dto) {
return dao.insert(dto);
}
public YoutubeDTO selectOne(int idx) {
return dao.selectOne(idx);
}
public int delete(int idx) {
return dao.delete(idx);
}
public int update(YoutubeDTO dto) {
return dao.update(dto);
}
}
package com.itbank.repository;
import java.util.List;
import com.itbank.model.TestDTO;
import com.itbank.model.YoutubeDTO;
public interface YoutubeDAO {
List<TestDTO> selectList();
int insert(YoutubeDTO dto);
YoutubeDTO selectOne(int idx);
int delete(int idx);
int update(YoutubeDTO dto);
}
Service와 Repository를 넘어가고
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
"-//mybatislorg//DTD Mapper 3.0/EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itbank.repository.YoutubeDAO" >
<select id="selectList" resultType="youtube">
select * from youtube_list order by idx
</select>
<!-- insert, update, delete 는 반환형이 int로 고정이므로 작성하지 않는다 -->
<insert id="insert" parameterType="youtube">
insert into youtube_list
(title, channel, thumbnail, iframe)
values
(#{title},#{channel},#{thumbnail},#{iframe})
</insert>
<select id="selectOne" parameterType="int" resultType="youtube">
select * from youtube_list
where
idx = #{idx}
</select>
<delete id="delete" parameterType="int">
delete youtube_list where idx = #{idx}
</delete>
<update id="update" parameterType="youtube">
update youtube_list
<set>
title = #{title},
thumbnail = #{thumbnail},
channel = #{channel},
iframe = #{iframe},
</set>
where
idx = #{idx}
</update>
</mapper>
Mapper.xml로 간다.
여기서 sql문을 실행해서 값을 추가,수정,불러온다.
여기서 중요한 점은id와 resultType과 parameterType이다.
id는 DAO의 함수이름이며 resultType는 불러온 값들이 어떤타입으로 반환되는지를 정의하는 것이다.
selectList를 보면 모든 값들을 불러왔고 그 값을 DTO파일으로 반환한다는 뜻이 된다.
parameterType은 보통 where문에 값을 넣을때 사용된다.
where문으로 특정 값만을 가져올 때 parameter를 where에 넣어서 가져온 값을들 resultType로 DTO타입이라고 정의하는'
것이다.
이렇게 이해를 한다면 딱히 어려운것은 없을것이다.
그렇게 가져온 값들을 전 jsp파일에서 EL태그로 ${parameter } 이런식으로 불러오면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="cpath" value="${pageContext.request.contextPath }" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>list.jsp</h1>
<hr>
<p>
<a href="${cpath }/youtube/add"><button>추가</button></a>
</p>
<c:forEach var="dto" items="${list }">
<div>
<div><a href="${cpath }/youtube/view/${dto.idx}"><img src="${dto.thumbnail }" width="250"/></a></div>
<div>${dto.title } | ${dto.channel }</div>
</div>
</c:forEach>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../home.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>view.jsp</h1>
<div>${dto.iframe }</div>
<h3>${dto.title }</h3>
<h3>${dto.channel }</h3>
<a href="${cpath }/youtube/delete/${dto.idx}"><button>삭제</button></a>
<a href="${cpath }/youtube/modify/${dto.idx}"><button>수정</button></a>
</body>
</html>
<%@ 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>add.jsp</h1>
<hr>
<form method="POST">
<p><input type="text" name="title" placeholder="제목" /></p>
<p><input type="text" name="channel" placeholder="채널이름" /></p>
<p><input type="text" name="thumbnail" placeholder="썸네일" /></p>
<p><input type="text" name="iframe" placeholder="영상태그" /></p>
<p><input type="submit" /></p>
</form>
</body>
</html>
JSP는 오류가 터지면 일단 페이지를 뛰워주고 오류를 찾는 형식이였지만 Spring은 실행과 동시에
컴파일을 실행하기 때문에 오타 한자라도 발생하면 페이지를 볼수가 없다.
그렇기에 하나만들고 뛰워보고 또 하나 만들고 이런식으로 하나씩 확인하면서 만드는게 중요하다고 생각한다.
앞으로 매일 포스팅은 힘들겠지만 시간이 날때마라 정리하여 국비교육이 끝났을때 다시 사용할 수 있을정도의
퀄리티는 유지해 보도록 하겠다.
그럼 오늘은 여기서 마치겠다.
'SpringFramework' 카테고리의 다른 글
스프링 프레임워크 - 사진 업로드 (0) | 2023.07.10 |
---|---|
스프링 프레임워크 - JDBC버전 뛰우는 과정 (1) | 2023.07.09 |
스프링 프레임워크 초기세팅 (2) | 2023.07.02 |