1023

이민규·2023년 10월 23일
0

Yaml

  • yaml은 xml, json같이 데이터 교환을 위해 쓰이는 데이터 형식의 일종 (비교적 포맷이 간단)
  • Key : Value의 형식 ( colon(:) 뒤에는 반드시 한 칸 띄어쓰기, 부모-자식 관계는 각 Object 사이에 두 칸 들여쓰기로 구분)
  • Array는 -(hyphen)으로 구분

Spring Boot 4 MyBatis

  • Spring Framework와 거의 유사한 형식을 따름 (Sql Mapper-DAO-Controller의 데이터 전달 및 처리)
  • Boot 4에서는 DAO의 역할이 단순 데이터 전달의 경로로만 쓰임

Ready Settings

SQL_DB

create table market(num smallint auto_increment primary key,
sang varchar(30),
price int,
photoname varchar(50),
ipgoday datetime);
  • JPA 사용하지 않을 시 sql문 작성, 테이블 생성 자동화 불가

Application_Yaml

#tomcat port
server:
  port: 9001
#jsp
spring:
  mvc:
    view:
      prefix: /WEB-INF/
      suffix: .jsp
  devtools:
    livereload:
      enabled: true
#mysql
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: url
    username: name
    password: pw
#mybatis
mybatis:
  type-aliases-package: data.model.dto,data.model.mapper
  #data.model.*..dao(mapper)패키지,dto패키지 등록
  mapper-locations:
  - /mapper/**/*.xml
  • yaml 형식으로 src/main/resources>application.yml 작성 (확장자 yml로 변경)
  • MyBatis 사용을 위해 교환할 자료 타입을 alias로 등록할 패키지 지정 (DAO(Mapper) 패키지, DTO 패키지를 등록)
  • sql문을 제어할 Mapper 파일의 경로와 형식을 지정 (중간 경로가 없어도 중간에 '/ * * /' 입력, 와일드카드와 다른 * )

Depencies

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.3.1</version>
</dependency>
      
<!-- 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>
  • MyBatis 등 필요한 의존성 주입
  • tomcat-embed-jasper 의존성 주입 (Boot 4는 SpringFramework, Eclipse 등과 달리 내장형 톰캣 서버 지원)

File Upload

  • 파일 업로드 위한 폴더 생성
  • Boot 4는 내장형 톰캣 서버를 지원하므로, 파일 업로드 시 실제 경로는 물론 내부 파일에서도 업로드 결과 확인 가능

DTO

@Data
@Alias("mdto") //mybatis에서는 dto의 타입을 사용,dto타입 지정
public class MarketDto {

	private int num;
	private int price;
	private String sang;
	private String photoname;
	private Timestamp ipgoday;
}
  • @Data로 getter, setter 생략
  • @Alias : Framework에서 MyBatis의 alias 기능 (MyBatis에서는 데이터 교환 시 DTO의 타입을 사용하므로, 이를 지정)

Mapper_SQL

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="data.model.mapper.MarketMapperInter">
	<select id="getTotalCount" resultType="int">
		select count(*) from market
	</select>
	
	<select id="getAllSangs" resultType="mdto">
		select * from market order by sang
	</select>
	
	<insert id="insertMarket" parameterType="mdto">
		insert into market (sang,price,photoname,ipgoday) values(#{sang},#{price},#{photoname},now())
	</insert>
</mapper>
  • DOCTYPE mapper 삽입
  • <mapper>의 namespace는 @Mapper 어노테이션으로 sql mapper와 Controller를 연결할 DAO(혹은 인터페이스)의 탐색 경로 지정 (alias로 대체 가능)
  • Mapper에서 sql문을 제어

DAO_Interface

@Mapper //Repository와 같은개념..인터페이스에도 가능
public interface MarketMapperInter {

	public int getTotalCount(); //메서드명이 id역할..id가 똑같아야함
	public List<MarketDto> getAllSangs();
	public void insertMarket(MarketDto dto);
	public MarketDto getData(int num);
	public void updateMarket(MarketDto dto);
	public void deleteMarket(int num);
}
  • @Mapper로 등록된 클래스(혹은 인터페이스)의 메서드는 sql문을 제어하는 Mapper와 Controller를 연결하는 기능 (Framework에서 @Repository로 DAO 등록하는 것과 유사한 개념, 하지만 @Mapper는 인터페이스도 등록 가능)
  • @Mapper의 메서드 이름은 Mapper의 id 역할이므로, <mapper>의 id-메서드명, 교환 데이터 타입동일해야 함
    • <select id="getAllSangs" resultType="mdto"> : public List<MarketDto> getAllSangs();

Controller

@Controller
public class MarketController {

	@Autowired
	MarketMapperInter mapper;
	
	@GetMapping("/market/list")
	public ModelAndView list() {
		ModelAndView model=new ModelAndView();

		int totalCount=mapper.getTotalCount();
		List<MarketDto> list=mapper.getAllSangs();

		model.addObject("totalCount", totalCount);
		model.addObject("list", list);

		model.setViewName("market/marketList");

		return model;
	}
	
	@PostMapping("/market/add")
	public ModelAndView add(@ModelAttribute("mdto") MarketDto dto,
			MultipartFile multi,
			HttpSession session) {
		
		ModelAndView model=new ModelAndView();
		model.setViewName("redirect:list");
		
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
		
		String path=session.getServletContext().getRealPath("save");
		
		String fName=multi.getOriginalFilename();
		String photo=sdf.format(new Date())+fName;
		
		try {
			multi.transferTo(new File(path+"\\"+photo));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		dto.setPhotoname(photo);
		
		mapper.insertMarket(dto);
		
		return model;		
	}
}
  • Framework의 Controller와 동일
  • DAO의 데이터 처리가 없으므로 Controller에서 Java Logic이 길어짐 (이를 해결하기 위해 DAO의 역할을 대신하는 Service 사용)
    • Controller에서 DAO(혹은 인터페이스)의 메서드를 통해 Mapper와 직접 데이터 교환

파일 업로드 시 <form type=”file”>의 name 속성(Controller의 MultipartFile 참조변수명)과 DB의 컬럼명이 일치할 시 파일 업로드 실패

View

  • 기존과 동일
profile
초보개발자

0개의 댓글