포스코DX X 비트교육센터 6기 - Spring


앞으로의 계획

image

메일 보내기

@Service
public class UserService {
	@Autowired

	private UserRepository userRepository;

	//java mail 보내기
	//@Autowired
	//private MailSender mailSender;

	public void addUser(UserVo vo) {
		userRepository.insert(vo);
		//mailSender.send(vo.getEmail(), "", "");
	}
}

image

  • 메일 보낼 때, 쓰는 포트

  • 공부해보기

Repository 문제점

  1. try - catch(문제) : AOP + RuntimeException (해결)
  2. BoilerPlate(문제) : Template Pattern(OOP design pattern) (해결)
  3. Spring JDBC(java code와 SQL) (문제) : mybatis - sql과 java를 분리함. (해결)

mybatis를 이론적인 면

SQL을 중심으로

  1. parameter mapping을 도와줌
  2. object(=result) mapping을 도와줌

mapper가 java code와 sql을 분리시키는 역할을 한다.

  • try - catch가 없어짐.

  • 간편하게 jdbc를 쓰는 기술

mybatis

  • SQLSessionFactory가 SQLSessionTemplate을 포함한다.

try -> [ mybatis ] SQLSessionTemplate

getConnection -> [ mybatis ] SQLSessionTemplate

prepare(SQL)

resultSet

close -> [ mybatis ] SQLSessionTemplate

catch -> [ mybatis ] SQLSessionTemplate

datasource

  • pom.xml

<!-- Common DBCP -->
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>

  • applicationContext.xml

<!-- Connection Pool DataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://localhost:3306/webdb" />
	<property name="username" value="webdb" />
	<property name="password" value="webdb" />
</bean>

  • repository
public class GuestbookRepository {
	@Autowired //이것 추가!!!
	private DataSource dataSource; //여기!!

	public List<GuestbookVo> findAll() {
		List<GuestbookVo> result = new ArrayList<>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = dataSource.getConnection(); //여기도!

.
.
.

mybatis 설정

  • pom.xml ( mybtis와 spring jdbc 추가)
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.poscodx</groupId>
		<artifactId>mysite</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>mysite03</artifactId>
	<packaging>war</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
		<maven.compiler.source>17</maven.compiler.source>
		<maven.compiler.target>17</maven.compiler.target>
		<org-springframework-version>5.3.25</org-springframework-version>
	</properties>

	<dependencies>
		<!-- spring mvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>

		<!-- spring jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>

		<!-- jstl -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- mariadb jdbc driver -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
			<version>3.0.8</version>
		</dependency>

		<!-- servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.2</version>
			<scope>provided</scope>
		</dependency>

		<!-- MyBatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.9</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.7</version>
		</dependency>


		<!-- Common DBCP -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>

	</dependencies>

	<build>
		<finalName>mysite03</finalName>
	</build>
</project>
  • applicationContext.xml

	<!--SqlSessionFactory -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="datasource" />
		<property name="configLocation"
			value="classpath:mybatis/configuration.xml" />
	</bean>

  • 패키지 및 파일 추가

image

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
    	</typeAliases>	
	<mappers>
		<mapper resource="mybatis/mappers/guestbook.xml" />
	</mappers>
</configuration>
  • 패키지 및 파일 생성

image

<?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="guestbook">
</mapper>

  • pom.xml
<!--SqlSession-->
	<bean id="sqlSession"
		class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory" />
	</bean>
  • repository에 추가
@Repository
public class GuestbookRepository {
	@Autowired
	private DataSource dataSource;
	
	@Autowired //여기
	private SqlSession sqlSession;
.
.
.
  • mappers 안의 xml 파일에 dml 문 작성

alias가 필요함.

<?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="guestbook">
	<select id='findAll' resultType="com.poscodx.mysite.vo.GuestbookVo">
		select * from guestbook order by no desc
	</select>
</mapper>

  • repository에 추가
	public List<GuestbookVo> findAll() {
		
		List<GuestbookVo> result = sqlSession.selectList("guestbook.findAll");
		
		return result;
		
	}

alias 설정 - configuration.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="com.poscodx.mysite.vo.GuestbookVo"
			alias="guestbookvo" />
	</typeAliases>

	<mappers>
		<mapper resource="mybatis/mappers/guestbook.xml" />
	</mappers>
</configuration>

  • 이용
<?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="guestbook">
	<select id='findAll' resultType="guestbookvo">
		select * from guestbook order by
		no desc
	</select>

	<delete id='deleteByNoAndPassword'>
		delete from guestbook where no =? and password =?
	</delete>

	<insert id="insert" parameterType="guestbookvo">
		insert into guestbook values(null, #{name }, #{password }, #{contents },
		now())
	</insert>
</mapper>

mybatis가 제공해주는 alias를 모두 소문자로 해놓았다. 그래서, 내껏도 다 소문자로! ex. map

insert

  • GuestbookRepository
	public Boolean insert(GuestbookVo vo) {
		int count = sqlSession.insert("guestbook.insert", vo);

		return count == 1;

	}

delete

  • xml
	
	<delete id='deleteByNoAndPassword' parameterType="map">
		delete from guestbook where no =#{no } and password = #{password }
	</delete>
  • repository
	public Boolean deleteByNoAndPassword(Long no, String password) {

		Map<String, Object> map = new HashMap<>();
		map.put("no", no);
		map.put("password", password);

		int count = sqlSession.delete("guestbook.deleteByNoAndPassword", map);

		return count == 1;
	}
  • sqlSession도 삭제!!!

#{} : 바인딩

${} : 치환