본문 바로가기
공부기록

5월 12일 (1) Spring - JDBC 연동 CRUD(입력)

by project100 2023. 5. 12.

setting
1. pom.xml에 라이브러리 연동
2. main에 폴더 만들기 webapp/WEB-INF/views

3. resources에 폴더 만들기 mappers
4. application.properties 작성

# jsp setting
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

# static resource folder setting
spring.web.resources.static-locations=classpath:static/

# port number setting
server.port=80

# Mybatis mapper setting
mybatis.mapper-locations=classpath:mappers/*.xml

# DB setting
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/스키마이름??serverTimezone=Asia/Seoul
spring.datasource.username=
spring.datasource.password=

 

MVC 

java - 프로젝트폴더명 

1. DB 테이블과 같은 구조(컬럼명과 같은 필드 명)로 DTO 클래스 작성

// JPA class를 만들면 db에 테이블이 만들어짐

package com.raspberry.springjdbc02.dto;

import lombok.Data;

@Data
public class TestDto {
    private int tcode;
    private String tname;
    private int tage;
    private String tphone;
}

 

2. 폴더 만들기 controller, service, dao

3. controller에 자바 클래스 만들기

@Controller, @Log

view폴더에 index.jsp파일 만들기

 

컨트롤러 매핑 메소드 작성 형식

1) 페이지만 변경하는 메소드

@ 메핑어노테이션("url")  -- @GetMapping / @PostMapping

public String 메소드명(){

   log.info("메소드명()");

   return("jsp이름");    - jsp 확장자 제외 

}

 

2) 데이터 전송하면서 페이지를 변경하는 메소드

@ 메핑어노테이션("url")  -- @GetMapping / @PostMapping

public ModelAndView 메소드명(){

   log.info("메소드명()");

   ModelAndView 변수명 = new  ModelAndView();

   변수명.addObject("식별자", 값객체); 

   변수명.setViewName("jsp이름");  - jsp 확장자 제외 

}

 
   // 페이지만 변경하는 메소드
   @GetMapping("/")

    public String home(){ //데이터를 안 보낼 때 string 사용
        log.info("home()");
        return "index";
    }
    
    
    // 데이터 전송하면서 페이지를 변경하는 메소드
    
    @GetMapping("/")

    public ModelAndView home() {
        log.info("home()");
        mv = new ModelAndView();
        return mv;
    }

 

2. views 파일에 inputForm.jsp파일 만들기

inputForm 파일에 html table로 입력 받아야할 데이터 양식 만들기

controller 연결

@GetMapping("inputForm")
public String inputForm(){
log.info("inputForm()");
return "inputForm";
}
 
3. inputFom으로 받은 데이터 controller로 처리하기
RedirectiAttribute 객체
리다이렉트 방식으로 페이지를 전환할 때, 일회성 메시지(데이터)를 전송하는 용도로 사용하는 객체
일반적인 전환 - return "jsp이름";
리다이렉트 방식의 전환 - return "redirect:url";
리다이렉트 방식은 특정 페이지를 처리하는 메소드가 있을 때, 화면 전환을 위해 그 메소드로 request를 보내는 방식.
 

4. dao파일에 인터페이스 파일로 dao만들기 

@Mapper

more action -> xml 선택 파일 경로 선택 src-resources - mappers => ok

아니면 mappers 폴더에 dao파일명.xml 만들기(dao 파일명과 똑같이 만들어야 한다.)

@Mapper
public interface TestDao {
// 데이터 삽입 insert 메소드 선언
void intertData(TestDto td)
}
 
dao파일에서 insertData 눌러서 추가
 
5. mappes 파일의 dao.xml파일
<insert id="intertData" parameterType="com.raspberry.springjdbc02.dto.TestDto"></insert>com.raspberry.springjdbc02.dto.TestDto 풀네임이라고 함
 
application.properties 추가
mybatis.type-aliases-package=com.raspberry.springjdbc02.dto

mappes 파일의 dao.xml의 풀네임 수정 가능

<insert id="intertData" parameterType="TestDto"></insert>

 
SQL문
INSERT INTO  testtb1 VALUES (null, '전우치', 25, '010-2548-4513');

-> mappes 파일의 dao.xml파일

INSERT INTO testtb1
VALUES (null, #{tname}, #{tage}, #{tphone});

 

6. service파일에 sevice 자바 클래스 만들기

package com.raspberry.springjdbc02.service;

import com.raspberry.springjdbc02.dao.TestDao;
import com.raspberry.springjdbc02.dto.TestDto;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Service
@Log
public class TestService {
    //Dao를 자동 주입
    @Autowired
    private TestDao tDao;
    private ModelAndView mv;

    // controller의 String view 연결
    public String inputData(TestDto td, RedirectAttributes rttr){
        log.info("inputData()");
        String view = null;
        String msg = null;

        // 저장용 메세지  try catch사용하기
        try{
            // 데이터 삽입 성공
            tDao.intertData(td);
            msg = "저장 성공";
            view =  "redirect:/"; //첫 페이지
        } catch (Exception e){
            // 데이터 삽입 실패
            e.printStackTrace();
            msg = "저장 실패";
            view = "redirect:inputForm"; // controller의 메소드 이름 inputForm()
        }
        rttr.addFlashAttribute("msg", msg);
        return view; // try catch의 view 변수
    }
}

7. controller 마무리

@Autowired
private TestService tServ;
@PostMapping("inputProc")
// 휘발성 전송 객체
public String inputProc(TestDto td, RedirectAttributes rttr){
log.info("inputProc()");
String view = tServ.inputData(td, rttr);
return view;

8. index, inputForm 

<script>
let m = '${msg}';
if(m!=''){
alert(m)
}
</script>