Spring

Spring, 스프링과 JDBC

greenyellow-s 2024. 10. 31. 18:04
728x90
반응형
스프링과 JDBC

 

스프링은 JDBC를 비롯하여 ORM프레임워크를 지원한다.

 

필요한 파일
파일 위치 패키지/폴더 파일
src/main/java spring.conf SpringCongiguration
member.bean DTO.java
member.dao DAO.interface
member.dao.impl DAOImpl.java
member.service Service.interface
member.service.impl ServiceImpl.java
member.controller MemberController.java
src/main/resources mapper Mapper.xml
spring db.properties 
mybatis-config.xml
src/main/webapp/WEB-INF/spring/appServlet * 만들어져있음 servlet-context.xml
  pom.xml

 

(* 밑줄친거는 생략이 되는 파일)

 

context빼고 전부  패키지/폴더 부터 생성해야된다.

 

 

 

 

 

 


환경설정 파일

 

 

pom.xml

 

maven 의존성 주입하는 파일

 

[Java 버전 바꾸기]

<java-version>11</java-version>
<org.springframework-version>5.3.37</org.springframework-version>

* 너무 낮은 버전에서는 안된다.

 

 

JDBC, Connection Pool, MySQL, MyBatis, Spring MyBatis, JSON, Lombok 추가

 

MVN Repository

https://mvnrepository.com/

 

<!-- JDBC -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.37</version>
</dependency>

<!-- Connection Pool -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.11.0</version>
</dependency>

<!-- MySQL -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.3.0</version>
</dependency>

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

<!-- Spring MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.1.2</version>
</dependency>

<!-- JSON -->
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.17.2</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

 

 

 

 

 

 

 

 

servlet-context.xml

 

bean 설정 파일

 

서버가 시작되면 가장 먼저 읽는 파일이다.

시작에서 오류가 발생되면 이 파일이나 pom.xml 파일이 오류가 났을 경우가 대다수다.

 

* 프로젝트를 생성하면 자동으로 만들어진다.

 

@RequestMapping한 곳에 String으로 return을 보낼 때 앞 뒤로 붙여질 것들

즉,  return "userForm"을 하면 /WEB-INF/ userForm.jsp로 이동한다는 의미이다. 

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

 

 

@Controller 선언한 파일을 사용할 수 있도록 Bean 설정

 

<context:component-scan base-package="member.controller"/>

 

...

 

 

 

 

 

 

 

 

SpringCongiguration

 

Spring Framework에서 데이터베이스 연결 및 MyBatis 설정을 구성하는 Java Config 파일

 

 

@Contiguration으로 선언

 

해당 클래스를 Spring의 설정 클래스임을 나타낸다.

이 어노테이션이 붙은 클래스는 Bean을 정의하고 구성하는 데 사용되며, Spring 컨테이너에 의해 관리된다.

 

- @Bean 어노테이션을 사용하여 메서드에서 반환하는 객체를 Spring의 Bean으로 등록할 수 있습니다.

 

- 애플리케이션의 전반적인 설정을 중앙에서 관리할 수 있어, 다양한 Bean의 의존성 및 설정을 조정하는 데 유용합니다.

 

- XML 설정보다 타입 안전성이 높아, 컴파일 시점에서 오류를 감지할 수 있습니다.

 

 

@Configuration
@EnableTransactionManagement // == <tx:annotation-driven transaction-manager="transactionManager"/>
@PropertySource("classpath:spring/db.properties")
@MapperScan("*.dao")
public class SpringConfiguration {

 

@PropertySource("classpath:spring/db.properties")

db.properties 파일 받아오기

 

@MapperScan("*.dao")

Mapper파일 가져오기

 

private @Value("${jdbc.driver}") String driver;
private @Value("${jdbc.url}") String url;
private @Value("${jdbc.username}") String username;
private @Value("${jdbc.password}") String password;

@Autowired
private ApplicationContext context;

/* DataSource */
@Bean
public DataSource dataSource() {
    BasicDataSource basicDataSource = new BasicDataSource();
    basicDataSource.setDriverClassName(driver);
    basicDataSource.setUrl(url);
    basicDataSource.setUsername(username);
    basicDataSource.setPassword(password);
    return basicDataSource;
}

@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource());

    //sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("spring/mybatis-config.xml"));
    sqlSessionFactoryBean.setMapperLocations(context.getResources("classpath:mapper/*Mapper.xml"));
    sqlSessionFactoryBean.setTypeAliasesPackage("*.bean");

    return sqlSessionFactoryBean.getObject(); //SqlSessionFactory로 변환시켜준다 getObject()
}

@Bean
public SqlSessionTemplate sqlSession() throws Exception {
    SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
    return sqlSessionTemplate;
}

@Bean
public DataSourceTransactionManager transactionManager() {
    return new DataSourceTransactionManager(dataSource());
}

 

 

  1. Database Configuration: @Value 어노테이션을 사용하여 application.properties 또는 application.yml 파일에서 JDBC 관련 설정(드라이버, URL, 사용자명, 비밀번호)을 주입
  2. DataSource Bean: dataSource() 메서드에서 BasicDataSource를 생성하여 데이터베이스 연결 정보를 설정하고, 이를 DataSource Bean으로 등록
  3. SqlSessionFactory Bean: sqlSessionFactory() 메서드에서 MyBatis의 SqlSessionFactory를 설정합니다. 데이터 소스를 연결하고, 매퍼 XML 파일의 위치를 지정
  4. SqlSessionTemplate Bean: sqlSession() 메서드에서 MyBatis의 SqlSessionTemplate을 생성하여 SQL 세션을 관리
  5. Transaction Manager Bean: transactionManager() 메서드에서 데이터베이스 트랜잭션을 관리하는 DataSourceTransactionManager를 등록

 

 

 

 

 

 

 

db.properties 

 

Java 애플리케이션에서 데이터베이스 연결 및 설정 정보를 저장하는 프로퍼티 파일이다.

## MySQL
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/[데이터베이스이름]?serverTimezone=Asia/Seoul
jdbc.username=[계정]
jdbc.password=[비밀번호]

 

 

 

 


DTO.java

 

 

데이터 전송 객체(Data Transfer Object)를 정의하는 클래스이다.

 

이 클래스는 데이터베이스의 컬럼과 동일한 속성을 가지며, 주로 데이터베이스에서 조회한 결과를 담거나 클라이언트와의 데이터 교환에 사용된다.

 

DB의 컬럼명과 동일하게 작성해야한다.

 

@Data
public class MemberDTO {
	private String name;
	private String id;
	private String pwd;

}

 

Data 대신 Setter, Getter를 넣어도 된다.

 

 

 

 

 


실제 이동 경로

 

 MemberController.java

 

@Controller
@RequestMapping(value="member")
public class MemberController {
	@Autowired
	private MemberService memberService;
	@Autowired
	private HttpSession session;
	
	//@RequestMapping(value="login", method=RequestMethod.GET)
	@GetMapping(value="login") //method=RequestMethod.GET 대신
	@ResponseBody
	public String login(@RequestParam String id, @RequestParam String pwd) {
		System.out.println(id + ", " + pwd);
		
		return memberService.login(id, pwd);
	}

}

 

@Controller로 선언

 

@RequestMapping(value="member") -> 주소가 /member/ 로 시작되는 모든 것들은 이곳으로 들어온다.

 

@RequestMapping(value="login", method=RequestMethod.GET) -> 주소가 /member/login 이면 이곳으로 온다.

 

@Autowired -- > 필요한 의존성을 자동으로 주입해준다. -> bean에서 property 등으로 선언 해주지 않아도 된다.
private MemberService memberService;

 

 

memberService.login(id, pwd); -> MemberService에 login(id, pwd)로 이동

 

 

 


 MemberService
public interface MemberService {
	public String login(String id, String pwd);

}

 

 

 


 MemberServiceImpl
@Service
@Transactional
public class MemberServiceImpl implements MemberService {
	@Autowired
	private MemberDAO memberDAO;

	@Override
	public String login(String id, String pwd) {
		Map<String, String> map = new HashMap<>();
		map.put("id", id);
		map.put("pwd", pwd);
		
		MemberDTO memberDTO = memberDAO.login(map);
        //...
		return "success";
	}

 

MemberService와 상속관계로 Override해서 함수를 가져온다.

 

@Service

해당 클래스를 서비스 컴포넌트로 인식하게 되고, Spring의 의존성 주입 및 관리 기능을 활용할 수 있다.

 

 

memberDAO.login(map); -> MemberDAO에서 login(map)함수를 찾는다.

 

 

 

 


DAO.interface

 

DATImpl에서 상속하는 상위계층

 

이 파일 자체에서 Mapper를 선언하면 DAOImpl 파일을 거치지 않아도 된다.

@Mapper
public interface BoardDAO {
	public void insertwrite(Map<String, String> map);
}

 

 

 

 

 


Mapper.xml

 

<?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="member.dao.MemberDAO">
	<select id="login" parameterType="java.util.Map" resultType="memberDTO">
		select * from userTable where id=#{id} and pwd=#{pwd}; 
	</select>

</mapper>

 

namespace 속성은 Mapper의 이름을 정의한다.

 

member.dao.MemberDAO로 설정되어 있어, 이 Mapper가 MemberDAO 클래스와 연결된다는 것을 나타낸다. 이를 통해 해당 Mapper를 쉽게 참조하고 사용할 수 있다.

 

select 태그의 id 속성은 SQL 쿼리의 고유 식별자를 정의한다. parameterType은 입력 파라미터의 타입을 지정하고, resultType은 쿼리 결과의 타입을 나타낸다.

 

 

여기서 가져온 나온 쿼리 결과를 return으로 계속 받아 Controller파일까지 가게된다.

 

 

 

 

 


 

즉, 사용자의 로그인 요청이 Controller에서 시작되어 Service와 DAO를 거쳐 MyBatis 쿼리를 실행하고, 그 결과를 다시 Controller로 반환한다. 최종적으로는 Controller에서 클라이언트에게 결과를 전달하게 된다.

 

728x90
반응형