Hello to my YUNIVERSE

[Day 2] SpringBoot + Vue.js์— MyBatis ๋ผ์–น๊ธฐ

by ์œค๊ทคํƒฑ๊ทค
๋ฐ˜์‘ํ˜•

์ด๋ ‡๊ฒŒ ์„ธํŒ… ๋ฐ”๋ณด๊ฐ€ ๋˜์–ด์žˆ์„์ง€ ๋ฏธ์ฒ˜ ์ €๋Š” ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

๊ณต๋ถ€ ์‹œ๊ธ‰ํ•ด์ง... ์˜ค๋Š˜๋ถ€ํ„ฐ ์ตœ๊ฐ•์•ผ๊ตฌ ์ง‘์—์„œ ๋ณด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. pom.xml ์ˆ˜์ •

์ง€๋‚œ๋ฒˆ์— SpringBoot Project ์ƒ์„ฑ ์‹œ, MyBatis์— ๋Œ€ํ•œ dependency๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ > Spring > Add Starters > MyBatis Framework ์ถ”๊ฐ€

๋‚œ ์ด๋ฏธ ์ถ”๊ฐ€ํ•ด๋ฒ„๋ ค์„œ ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•˜์ง€๋งŒ, ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์„ ๋งž์ถฐ์ฃผ๋ฉด ๋œ๋‹ค.

 

2. application.properties ์ˆ˜์ •

src/main/resources ํŒŒ์ผ ๋ฐ‘์— ์žˆ๋Š” application.properties ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ๋‹ค.

 

application.properties

#db connection(Oracle)
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=์˜ค๋ผํด db ์‚ฌ์šฉ์ž id
spring.datasource.password=๋น„๋ฐ€๋ฒˆํ˜ธ
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.sql.init.encoding=UTF-8

#mapper.xml location
mybatis.mapper-locations:classpath*:com/insa/insaSystem/mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true

spring.datasource.hikari.maximum-pool-size=5

spring.datasource.url์€ port์™€ sid๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๋“ฏ ์‹ถ๋‹ค.

mybatis.mapper-locations๋Š” mapper xmlํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

์ด ๋•Œ classpath๋Š” src/main/resources ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

mybatis.configuration.map-underscore-to-camel-case=true: ์–ธ๋”๋ฐ”๋ฅผ camel case๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์„ค์ •์ด๋‹ค.
DB๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„์ด ์—†์œผ๋ฏ€๋กœ ์–ธ๋”๋ฐ”๋ฅผ ์ด์šฉํ•ด ๋‹จ์–ด์˜ ๊ฒฐํ•ฉ์„ ๊ตฌ๋ถ„, java๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฏ€๋กœ camel case๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ์ด๋ฆ„์ด ๋‹ค๋ฅด๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ๋งคํ•‘๋˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ์„ค์ •์ด๋‹ค.

(์ถœ์ฒ˜ : https://velog.io/@0829kuj/%EC%8A%A4%ED%94%84%EB%A7%81%EC%88%98%EC%97%85-15%EC%9D%BC%EC%B0%A8)

 

spring.datasource.hikari.maximum-pool-size๋Š” ๋ง๊ทธ๋Œ€๋กœ hikari์˜ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ hikari๊ฐ€ ์„ค์น˜๊ฐ€ ๋œ๋‹ค๊ณ  ๋ณธ ๊ฒƒ ๊ฐ™์€๋ฐ, ์‚ฌ์‹ค ์—๋Ÿฌ ์ˆ˜์ •ํ•˜๋‹ค๊ฐ€ ๋ƒ…๋‹ค ์ถ”๊ฐ€ํ•œ๊ฑฐ๋ผ ํ˜„์žฌ์ƒํ™ฉ์—์„œ๋Š” ํ•„์š” ์—†๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„...

 

โ€ป classpath ๊ฒฝ๋กœ ์ฐพ์•„๋ณด๊ธฐ (←์ด๊ฑฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋‚œ ์‚ฌ๋žŒ That's me)


ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ > Build Path > Configure Build Path ... > Source ํƒญ ํด๋ฆญ


classpath๋Š” ์œ„ java build path์˜ source ํด๋”๋ฅผ ๋ชจ๋‘ ๊ฒ€์ƒ‰?ํ•œ๋‹ค.
ํ—Œ๋ฐ ๋‚˜๋Š” resources ํŒŒ์ผ์ด ํ•ด๋‹น ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ xml ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด์„œ...์˜จ๊ฐ– ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค.
resources ํŒŒ์ผ ์•„๋ž˜์— .xml ํŒŒ์ผ์„ ์œ„์น˜์‹œํ‚ฌ๊ฑฐ๋ผ๋ฉด! ๊ผญ ํ™•์ธํ•ด๋ณผ ๊ฒƒ!!!!

 

3. sql Bean ์ถ”๊ฐ€ → ProjectApplication.java

 

ProjectApplication.java

@SpringBootApplication(exclude = {MybatisAutoConfiguration.class})
@MapperScan(basePackages="com.insa.insaSystem.mapper")
public class ProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(InsaSystemApplication.class, args);
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		
		sessionFactory.setDataSource(dataSource);
		sessionFactory.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath*:com/insa/insaSystem/mapper/*.xml")
		);
		return sessionFactory.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

}

@MapperScan basePackages์—๋Š” mapper ๋˜๋Š” dao์— ํ•ด๋‹นํ•˜๋Š” package๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

sessionFactory MapperLocations์—๋Š” ํ”„๋กœํผํ‹ฐ์— ์ž‘์„ฑํ•œ .xml ๊ฒฝ๋กœ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

 

4. Mapper interface, Mapper.xml ์ž‘์„ฑ

 

TestMapper.java (

@Mapper
public interface TestMapper {
	
	public String testDB(@Param("rank") int rank) throws Exception;
}

DB์— ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ testDB๋ผ๋Š” interface๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

์‚ฌ์‹ค, input Parameter ํ•„์š”์—†๋Š”๋ฐ.... ์‚ฝ์งˆํ•˜๋А๋ผ ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•ด๋ณด๋А๋ผ ๋„ฃ์–ด์คฌ๋‹ค.

 

ํ•ด๋‹น interface๊ฐ€ mapper๋ผ๋Š”๊ฑธ ์•Œ๋ ค์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— @Mapper ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

testMapper.xml

<?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">
<mapper namespace="com.insa.insaSystem.mapper.testDao">
	
	<select id="testDB" parameterType="java.lang.Integer" resultType="java.lang.String">
		SELECT TEST_COL
		FROM TEST_TABLE
		WHERE RANK_COL = #{rank}
	</select>

</mapper>

.xml ํŒŒ์ผ ์ฟผ๋ฆฌ id์™€ interface์—์„œ ์ž‘์„ฑํ•œ ๋ฉ”์†Œ๋“œ๋ช…์ด ๊ฐ™์•„์•ผํ•œ๋‹ค.

 

↓ Error Log

๋”๋ณด๊ธฐ

@Select ์–ด๋…ธํ…Œ์ด์…˜

 

์‚ฌ์‹ค ์œ„์— ์ฝ”๋“œ์™€๋Š” ์ƒ๊ด€ ์—†์ง€๋งŒ, ์–ด๋…ธํ…Œ์ด์…˜์— ์ดํ•ด ์—†์ด ๋ƒ…๋‹ค ์—๋Ÿฌ ์—†์• ๊ฒ ๋‹ค๊ณ  ์ผ๋‹ค๊ฐ€

ORA-00900 : invalid SQL statement ์—๋Ÿฌ๋ฅผ ๋ง›๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

 

@Select @Insert @Update ์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์€ xml ํŒŒ์ผ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

๋‚ด๊ฐ€ ๊ตฌ๊ธ€๋ง ํ•  ๋•Œ์—๋Š” ์ •์ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์“ด๋‹ค๊ณ  ๋ดค๋Š”๋ฐ, ์ง€๊ธˆ ๋˜ ๊ตฌ๊ธ€๋งํ•ด๋ณด๋‹ˆ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.

 

@Mapper
public interface TestMapper {
	
	@Select("SELECT TEST_COL FROM TEST_TABLE WHERE RANK_COL = 1")
	public String testDB(@Param("rank") int rank) throws Exception;
}

์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋•Œ ๋‚˜๋Š” resources ๊ฒฝ๋กœ์„ค์ •์ด ์ œ๋Œ€๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ xml ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์˜€๊ณ ,

ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง๋งŒ ๋“ฃ๊ณ , @Select("testDB")

์ฟผ๋ฆฌ ID๋ฅผ ๋ƒ…๋‹ค ์จ๋ฒ„๋ ธ๋‹ค. ์ผ๋‹จ SQL ์—๋Ÿฌ๊ฐ€ ๋‚˜๋‹ˆ, SQL ์—ฐ๊ฒฐ์€ ๋œ๊ฑฐ ์•„๋‹Œ๊ฐ€!!ํ•˜๋Š” ๊ธฐ์จ๊ณผ ํ•จ๊ป˜ ๋ง์ด๋‹ค.

 

์–ด์ฉ์ง€...์ด๋Ÿฐ ์–ด๋…ธํ…Œ์ด์…˜ ์—†์ด๋„ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ ์Šคํ”„๋ง๋ถ€ํŠธ๋ผ ์“ฐ๋Š”๊ฑด๊ฐ€ ์‹ถ์—ˆ๋‹ค.

๊ณต๋ถ€ํ•˜์ž...์œค๊ทค์‹œ...

 

4. service.java, serviceImpl.java ์ž‘์„ฑ ํ›„, DB ์—ฐ๋™ test

 

ProjectService.java

public interface TestService {
	public String test(int rank) throws Exception;
}

 

ProjectServiceImpl.java

Service
public class TestServiceImpl implements TestService{
	
	@Autowired
	testMapper testMapper;
	
	@Override
	public String test(int rank) throws Exception {
		return testMapper.testDB(rank);
	}
}

 

ProjectController.java

@Controller
public class ProejctController {
	
	@Autowired
	TestService testService;
	
	@RequestMapping(value = "/", method=RequestMethod.GET)
	public ModelAndView home() throws Exception {
		ModelAndView mv = new ModelAndView();
		
		mv.setViewName("index.html");
		
		int rank = 1;
		String test = testService.test(rank);
		
		System.out.println("DB ์—ฐ๋™ ํ™•์ธ์šฉ");
		System.out.println();
		System.out.println(test);
		
		return mv;
	}
}

 

์ž‘์„ฑ ํ›„, SpringBoot ๋‚ด์žฅ ํ†ฐ์บฃ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด

์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'FRONTEND > VUE.JS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Day 1] SpringBoot + Vue.js ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…  (1) 2023.03.12

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

๐™‰๐™š๐™ซ๐™š๐™ง ๐˜ฟ๐™ž๐™š

์œค๊ทคํƒฑ๊ทค

ํ™œ๋™ํ•˜๊ธฐ