1. MyBatis와 SqlSession의 역할 이해
1.1 SqlSession의 역할
- SQL 실행의 핵심 객체:
SqlSession은 MyBatis의 중심 객체로, 데이터베이스와의 연결을 통해 SQL을 실행하고 결과를 반환하는 역할을 합니다.
- 트랜잭션 관리:
SqlSession 객체는 데이터베이스 트랜잭션을 관리하는 기능을 포함하며, 필요시 commit 및 rollback 메서드를 통해 트랜잭션 처리를 제어할 수 있습니다.
- Mapper 인터페이스 연결:
SqlSession의 getMapper() 메서드를 통해 Mapper 인터페이스를 가져올 수 있으며, Mapper 인터페이스 메서드를 호출하면 SqlSession이 자동으로 SQL을 실행합니다.
1.2 SqlSession의 동작 흐름
- Mapper 연결:
sqlSession.getMapper(Service.class)와 같은 방식으로 Service 인터페이스를 구현하는 프록시 객체를 생성합니다.
- SQL 실행: Mapper 인터페이스의 메서드를 호출하면, MyBatis가
SqlSession을 통해 Mapper XML에 매핑된 SQL을 찾아 실행합니다.
- 결과 반환:
SqlSession이 SQL을 실행한 후, 결과를 Mapper 인터페이스의 메서드 형태로 반환합니다.
2. 기존 방식: 컨트롤러에서 SqlSession 직접 사용
2.1 기존 방식의 개요
- 설명: 컨트롤러에서
SqlSession을 직접 주입받고, sqlSession.getMapper(Service.class)로 Mapper 인터페이스를 호출하여 데이터베이스 작업을 수행하는 방식입니다.
- 구조: 서비스 계층 없이 컨트롤러에서 직접
SqlSession을 사용하여 데이터베이스 작업을 처리하므로, 계층 구조가 간소화됩니다.
2.2 예제 코드 (기존 방식)
@Controller
public class ExampleController {
@Autowired
private SqlSession sqlSession;
@RequestMapping("/insertExample")
public String insertExample(@RequestParam String name) {
Service service = sqlSession.getMapper(Service.class);
service.insertData(name); // Service 인터페이스의 insertData() 호출
return "redirect:/exampleList";
}
}
2.3 장단점
- 장점: 코드가 간단하며, 빠르게 데이터베이스 작업을 수행할 수 있습니다.
- 단점:
- 서비스 계층 없이 컨트롤러에서 직접 데이터베이스 작업을 수행하므로, 코드가 중복될 수 있고 유지보수성이 낮아집니다.
- 여러 곳에서 동일한 로직을 사용할 때 코드 재사용이 어렵고, 비즈니스 로직이 분리되지 않아 복잡도가 높아질 수 있습니다.