항상 개발환경 설정으로 고통받는다.
어찌저찌 모든 방법을 시도해본 결과, 이 방법이 DB SQL과 연동을 잘 해주었기에 여기에 기록한다
* Spring 프레임워크 이클립스 마켓 플레이스에서 미리 다운받았다고 가정
* DB는 MySQL을 기반으로 연동
1. src/main/resources 에 있는 application property 설정
아래 바꿀 것만 바꾸고 그대로 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:본인 포트 번호/본인 DB 이름?characterEncoding=UTF-8&serverTimezone=UTC&SSL=false
spring.datasource.username= 본인 DB 아이디
spring.datasource.password= 본인 DB 비밀번호
# 아래는 SQL 문장을 log에 출력하는 문장이므로 넣어놓고 필요없을 때 지우자
# 좀더 세밀하게 출력하려면 DEBUG대신 TRACE 사용
logging.level.com.tjoeun.mybatisTest = DEBUG
2. Dependency 추가
porm.xml에 설정. 아래 그대로 추가. 다만 버전은 변동될 수 있으므로 maven respiratory에서 받는걸 추천
<!-- MyBatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- MyBatis-Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<!-- spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.17</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<!-- spring에서 DB처리 + Transaction 처리-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<!-- spring에서 DB처리 + Transaction 처리-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
이러면 일단 세팅은 끝이다! 알고나니 정말 아무것도 아니다 ㅜㅜㅠㅜㅠ
이제 mySQL과 연동이 잘 되나 실험할 차례
1. 실험하기 위해 mySQL에 company라는 table을 하나 만들고 시작
table의 column 값은 name, address로 설정 (VARCHAR())
2. company 클래스 하나 생성
package com.tjoeun.mybatisTest;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
//lombok, getter and setter를 자동으로 생성해주는 라이브러리
public class Company {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3. Mapper interface 생성
SQL을 연동할 때 mybatis에서 애노테이션으로 @select, @insert, @delete, @update를 지원해준다.
이 애노테이션을 사용해서 Mapper 라는 interface에 메서드만 생성하면 그 메서드를 Controller에서 구현하여 값을 Mapper로 전달하여 SQL문장을 실행한다.
@Repository
@Mapper
public interface companyMapper {
// 서비스에서 sql에 연동할 때 구현할 메서드
// insert에 넣은 sql 함수를 실행해서 param을 통해 받아온 company객체의 name과 address를 대입한다
// 이때 다른 EL과 JQuery와는 다르게 #을 쓰는 것에 주의
@Insert("INSERT INTO company(name, address)"
+ "VALUES(#{company.name}, #{company.address})")
// Option을 줘서 SQL객체가 생성될 때 마다 자동 키값을 생성하고 name이라는 변수값을 통해서 키값에 접근할 수 있다.
// 이 키값으로(name) 삭제, 혹은 조회에 사용가능
@Options(useGeneratedKeys = true, keyProperty = "id")
// int의 반환 이유는 입력이 성공하면 1을 반환하고 실패하면 0이 반환된다
int insert(@Param("company") Company company);
@Select("SELECT * FROM company")
// 만약 Results를 재활용해야한다면 id를 지정하고 value로 다수의 result를 지정해서
// @ResultMap("compMapper")라는 함수로 축약할 수 있다
@Results( id = "compMapper", value ={ //s 까먹지 말자
// column(SQL)의 값인 name, id, address의 값을 찾아온다음에 = sql과 column의 변수 이름은 반드시 동일해야하고
// company객체(property)의 값에 넣고 list로 반환시킨다 = 객체 인스턴스 변수명과 property 변수명은 반드시 동일해야한다
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "address", column = "address")
})
List<Company> getList(@Param("company") Company company);
@Select("SELECT * FROM company WHERE id = #{id} ")
@ResultMap("compMapper")
Company getbyid(@Param("id") int id);
}
4. 마지막으로 위의 interface의 메서드를 구현해서 일반적인 Spring MVC모델을 사용하면 작동된다.
@Controller
@RequestMapping("/company")
public class CompanyController {
@Autowired
private companyMapper companyMapper;
// 인터페이스를 통해 받은 companyMapper를 통해 insert를 company 객체로 넣는다
@GetMapping("")
public String post(Company company, Model m) {
company.setName("화신정공");
company.setAddress("서울시");
int i = companyMapper.insert(company);
System.err.println("test용 " + i);
m.addAttribute("i", i);
return "index";
}
@GetMapping("/list")
public String getList(Company company, Model m) {
List<Company> list = companyMapper.getList(company);
m.addAttribute("list", list);
return "company";
}
@GetMapping("/detail")
public String getbyid(@RequestParam("id")int id, Company company, Model m) {
System.err.println("pathvariabletest " + id);
Company com = companyMapper.getbyid(id);
m.addAttribute("com", com);
return "compdetail";
}
}
참조:
https://www.youtube.com/watch?v=4YOk7oLGTKI&t=501s
'국비과정 > Spring Framework' 카테고리의 다른 글
@sessionattributes에 여러개의 키를 주기 (0) | 2022.04.12 |
---|---|
클래스 VO 설계방법 (0) | 2022.04.05 |
Transactional 애노테이션 사용방법 (0) | 2022.04.05 |
PathVariable과 RequestParam의 getMapping설정방법 (0) | 2022.03.27 |
스프링 프레임워크 기본 세팅 하는 법 + MVC 패턴 설명 (0) | 2022.03.23 |