SPRING - SPRING BOOT 4 mybatis

최성현·2023년 10월 23일
1

SPRING BOOT 4

목록 보기
3/3

설정

pom.xml

		<!-- jstl -->
		<dependency>
		    <groupId>jstl</groupId>
		    <artifactId>jstl</artifactId>
		    <version>1.2</version>
		</dependency>
		
		<!-- tomcat-embed-jasper -->
		<dependency>
		    <groupId>org.apache.tomcat.embed</groupId>
		    <artifactId>tomcat-embed-jasper</artifactId>
		    <scope>provided</scope>
		</dependency>

application.yml

yml은 자동 들여쓰기 적용

mybatis setting

application.yml

mybatis:
  type-aliases-package: data.model.* #data.model.mapper(dao역할)/data.model.dto 를 등록한 것
  mapper-locations:
  - /mapper/**/*.xml #src/main/resources 안 mapper 폴더 안 .xml 파일 위치 등록
#yml버전 자동 들여쓰기 적용
#tomcat port
server:
  port: 9001
#jsp - yml에서는 앞에가 같으면 띄어서 적어짐
spring:
  mvc:
    view:
      prefix: /WEB-INF/
      suffix: .jsp
  devtools:
    livereload:
      enabled: true
#mysql
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/coffee?serverTimezone=Asia/Seoul
    username: tjdgus
    password: 1234

    
#mybatis setting
mybatis:
  type-aliases-package: data.model.* #data.model.mapper(dao역할)/data.model.dto 를 등록한 것
  mapper-locations:
  - /mapper/**/*.xml #src/main/resources 안 mapper 폴더 안 .xml 파일 위치 등록

MarketSql.xml

src/main/resources 안 mapper 폴더 안 MarketSql.xml

reference Maven 들어가서 Download Artifact Javadoc 체크해주면 빨간줄 사라짐

<?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">
  <!-- reference Maven 들어가서 Download Artifact Javadoc 체크해주면 빨간줄 사라짐 -->
<mapper namespace="data.model.mapper.MarketMapperInter">
	<select id="getTotalCount" resultType="int"> 
		select count(*) from market
	</select>
	<select id="getAllSangpums" resultType="mdto"> <!-- dto에 @Alias("mdto")로 설정해줌 -->
		select * from market order by num
	</select>
	<insert id="insertMarket" parameterType="mdto">
		insert into market (price,sang,photoname,ipgoday) values(#{price},#{sang},#{photoname},now())
	</insert>
</mapper>

data.model.mapper 패키지

MarketMapperInter.java

  • Mapper
    sql문 전달자 역할

이곳에서 dao의 역할을 대신 해줄 수 있기 때문에 dao는 필수가 아니게 된다

  • public int getTotalCount();
    메소드명이 id역할을 수행 / sql의 mybatis와 이름(id)이 같아야함 ... interface ->MarketSql.xml 로 가야함
package data.model.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import data.model.dto.MarketDto;

@Mapper //sql문 전달자 역할
public interface MarketMapperInter { //이곳에서 dao의 역할을 대신 해줄 수 있기 때문에 dao는 필수가 아니게 된다

	public int getTotalCount(); //메소드명이 id역할을 수행 / sql의 mybatis와 이름(id)이 같아야함 ... interface ->MarketSql.xml 로 가야함
	public List<MarketDto> getAllSangpums();
	public void insertMarket(MarketDto dto);
	public MarketDto getData(String num);
	public void updateMarket(MarketDto dto);
	public void deleteMarket(String num);
}

boot.mvc.sist

SpringBootMybatis4Application.java

  • @MapperScan("data.model.mapper")
    @MapperScan bean에 등록하는 것 대신 등록 / mapper는 dao의 역할
package boot.mvc.sist;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("data.model.*")
@MapperScan("data.model.mapper") //@MapperScan bean에 등록하는 것 대신 등록 / mapper는 dao의 역할
public class SpringBootMybatis4Application {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootMybatis4Application.class, args);
	}

}

Service

Spring boot에서 jpa나 mybatis사용시 mapper에 추가적인 자바코드가 필요할 때 사용하는 공간

MarketServiceinter.java

  • MarketMapperInter 쓰다가 java문을 더 써줄게 있다면 service interface에 그대로 가져와서 MarketService를 만들어준다

  • MarketMapperInter에서 그대로 가져왔다 (MarketService.java에서 implements만을 받을 용도)

이 interface는 단순히 service에서 implements를 받기 위해 만들어진 interface이다

Map 인자값 사용

넘겨줄 인자값이 2개 이상이라 map으로 넣어주려면 그 map을 풀어서 인자값으로 각각 넣어주면 된다

package data.model.service;

import java.util.List;

import data.model.dto.MarketDto;

public interface MarketServiceInter { //MarketMapperInter 쓰다가 java문을 더 써줄게 있다면 service interface에 그대로 가져와서 MarketService를 만들어준다

	public int getTotalCount();
	public List<MarketDto> getAllSangpums();
	public void insertMarket(MarketDto dto); //넘겨줄 인자값이 2개 이상이라 map으로 넣어주려면 그 map을 풀어서 인자값으로 각각 넣어주면 된다
	public MarketDto getData(String num);
	public void updateMarket(MarketDto dto);
	public void deleteMarket(String num);
}

MarketService.java

이 service는 옛날의 dao처럼 추가 코드를 작성할 곳으로 사용할 곳

@Service

옛날의 dao라 생각 / mapper(sql)를 보완해주는 공간

MarketServiceInter

MarketMapperInter.java 1개로 자바개념을 다 할 수 있다면 data.model.service를 만들어줄 필요 없다

implements

service에서 mapper를 implement를 받지는 않는다

MarketServiceInter는 implements를 받기 위해서 만든 interface

@Autowired

실제로 @Autowired를 받아오는 곳은 MarketMapperInter이다

package data.model.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import data.model.dto.MarketDto;
import data.model.mapper.MarketMapperInter;

@Service //옛날의 dao라 생각 / mapper(sql)를 보완해주는 공간
public class MarketService implements MarketServiceInter { //MarketMapperInter.java 1개로 자바개념을 다 할 수 있다면 data.model.service를 만들어줄 필요 없다
							//mapper를 implement를 받지는 않는다
	
	//MarketServiceInter는 implements를 받기 위해서 만든 interface
	@Autowired
	MarketMapperInter mapperInter; //실제로 @Autowired를 받아오는 곳은 MarketMapperInter이다  
	
	@Override
	public int getTotalCount() {
		// TODO Auto-generated method stub
		return mapperInter.getTotalCount();
	}

	@Override
	public List<MarketDto> getAllSangpums() {
		// TODO Auto-generated method stub
		return mapperInter.getAllSangpums();
	}

	@Override
	public void insertMarket(MarketDto dto) {
		// TODO Auto-generated method stub
		mapperInter.insertMarket(dto);
	}

	@Override
	public MarketDto getData(String num) {
		// TODO Auto-generated method stub
		return mapperInter.getData(num);
	}

	@Override
	public void updateMarket(MarketDto dto) {
		// TODO Auto-generated method stub
		mapperInter.updateMarket(dto);
	}

	@Override
	public void deleteMarket(String num) {
		// TODO Auto-generated method stub
		mapperInter.deleteMarket(num);
	} 

}

Service 공간 사용할 경우

Controller @Autowired

자바코드를 보완한 service를 @Autowired 해줘야한다

	@Autowired
	MarketService service;
package data.model.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

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.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import data.model.dto.MarketDto;
import data.model.mapper.MarketMapperInter;
import data.model.service.MarketService;

@Controller
public class MarketController {

//	@Autowired
//	MarketMapperInter mapper;
	
	@Autowired
	MarketService service; //MarketService를 받아와서 사용하면 된다 / mapper를 보완해서 service를 만들었기 때문
	
	@GetMapping("/")
	public String start()
	{
		return "redirect:market/list";
	}
	
	@GetMapping("/market/list")
	public ModelAndView list()
	{
		ModelAndView model=new ModelAndView();
		
		//db로부터 총 갯수 얻기
		int totalCount=service.getTotalCount();
		List<MarketDto> list=service.getAllSangpums();
		
		model.addObject("totalCount", totalCount);
		model.addObject("list", list);
		
		model.setViewName("market/marketlist");
		
		return model;
	}
	
	@GetMapping("/market/writeform")
	public String writeform()
	{
		return "market/addform";
	}
	
	@PostMapping("/market/add")
	public String add(@ModelAttribute MarketDto dto,
			@RequestParam MultipartFile upload,
			HttpSession session)
	{
		String path=session.getServletContext().getRealPath("/save");
		System.out.println(path);
		
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
		
		if(upload.getOriginalFilename().equals(""))
			dto.setPhotoname(null);
		else {
			String fName=sdf.format(new Date())+upload.getOriginalFilename();
			dto.setPhotoname(fName);
			
			try {
				upload.transferTo(new File(path+"/"+fName));
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		service.insertMarket(dto);
		
		return "redirect:list";
	}
	
	@GetMapping("/market/delete")
	public String delete(@RequestParam String num,
			HttpServletRequest request)
	{
		String photo=service.getData(num).getPhotoname();
		
		if(photo!=null)
		{
			String path=request.getServletContext().getRealPath("/save");
			
			File file=new File(path+"/"+photo);
			file.delete();
		}
		
		service.deleteMarket(num);
		
		return "redirect:list";
	}
}
profile
백엔드 개발자로서 성장해 나가는 성현이의 블로그~

0개의 댓글