포스트

(Day 88)

PDF

Review

  • @SessionAttributes, @ModelAttribute를 사용하여 세션 값을 제어할 수 있는가?
  • 인터셉터의 구동에 대해 설명하고 구현하고 설정할 수 있는가?
  • HttpMessageConverter에·대해 설명할 수 있는가?
  • 요청으로 보낸 JSON 데이터를 객체로 자동 변환하여 request handler의 파라미터로 받을 수 있는가?
  • request handler가 리턴한 객체를 JSON 데이터로 자동 변환하여 응답할 수 있는가?

myapp을 javaConfig 사용하도록 변경하기

…아주빠른실습

파라미터로 맵 객체를 받은 경우,

맵 객체에 뭔가를 새로 넣었을 때 쿼리스트링으로 자동으로 붙는다!!! 페이지 컨트롤러에서 붙여서 DispatcherServlet에 넘기기 때문. 명시되어 있지 않으므로 주의하기

드디어 MyBatis 도입

MyBatis가 무엇인가? java에서 SQL을 통해 DB를 다루려면 SQL문과 JDBC를 이용해야 했다. 그래서 java 문서 하나에 SQL 문도 들어가다보니 길다란 스트링 SELECT ~~~~~~~~~~~~~~~~~ 이 생겼다. 이런 긴 문자열들에 컴파일러가 뭔가를 체크해줄 수도 없고, 린터가 들어가지도 않으니 가독성이 많이 떨어지며, java와 SQL을 오가며 작성하는 것이 매우 비효율적이었다. 이것을 해결해주기 위해 MyBatis가 등장했다.

원리는 기존 JDBC, SQL 동일

MyBatis 또한 그 SQL, JDBC를 이용한 것이다. 다만 그에 대한 인터페이스를 제공하여 JDBC와 SQL 을 좀 더 다루기 쉽게 해준 것이다.

DB를 쓰는 프로그램을 작성하는 두 가지 방법

  1. 직접 SQL 문을 작성하여 DBMS에 작업을 요청하는 경우
  2. API를 통해 생성된 SQL문이 DBMS에 작업을 요청하는 경우

여기서 1번은 SQL Mapper라고 한다. 대표적인 프레임워크로는 MyBatis 가 있다. 2번은 OR Mapper 라고 한다. Object-Relation Mapper 이다. 대표적으로는 Hibernate를 포장한 Java Persistance API (JPA) 가 있다.

무슨 차이가 있나? 만약 DBMS가 바뀌는 경우라면?

SQL Mapper를 사용한다면 작성자가 SQL을 잘 알고 있어야 한다. DBMS 특성에 맞춰서 SQL을 직접 작성해야 하기 때문이다. 그래서 좀 번거롭다는 단점도 생기지만, 반대로 최적화된 쿼리를 작성하여 DBMS의 성능을 최대로 뽑아낼 수 있다는 장접도 있다.

OR Mapper를 사용한다면 작성자가 SQL을 자세히는 모르더라도, 아마도 사용하기에는 언어가 동일하므로 조금 더 쉬울 것이다. DBMS에 대한 종속성도 조금은 낮출 수 있다. 유지보수가 더 쉬워질 것이다. 하지만 DBMS의 성능을 최대로 활요하기로 기대하기는 어려울 것이다. 그리고 DBMS 회사에서 해당 OR Mapper와의 API를 제대로 지원하지 않 으면 문제가 될 것이다.

Legacy 에 대하여

레거시에 SI하는 경우 OR Mapper를 적용하는 것이 나쁜 선택이 될 수도 있다. SQL문도 작성하고 API도 사용해야 하는, 복잡도를 높이는 선택이 될 수 있기 때문이다. 그리고 OR Mapper도 결국은 SQL문을 API를 통해 생성하는 것인데, SQL에 익숙하지 않은 경우라면 SQL Mapper를 사용하여 SQL도 연습하는 것이 좋다.

학습을 한다면

학습을 한다면, Java와 디자인패턴을 배운 다음에 Spring의 IoC 개념을 배운다.

JDBC를 배워야 MyBatis를 이해할 수 있다. MyBatis를 배운 다음에 JPA를 배울 수 있다.

Servlet을 이햏둬야 Spring webMVC를 이해할 수 있다. Spring WebMVC를 배우고 나면 RESTful 의 필요성을 느끼고, 그 다음에 Spring Boot를 배우면 적절하다.

HTML, CSS, JS를 다 배우면, JS를 좀 더 파서 JQuery를 배울 수 있고, Bootstrap을 배울 수 있고 AJAX를 배울 수 있다. 이것들을 다 배워봤다면 React를 배워볼만하다.

MyBatis에서 DB 컬럼명과 동일한 vo의 필드들에 넣어주는데…

그럼 java에서 sql 컨벤셔에 따라 컬럼을 네이밍할까?

아니면 sql 컬럼 이름을 java의 네이밍 컨벤션에 따라 변경할까?

둘 다 그렇게 하지 마라! 각각의 컨벤션이 있고 그것을 존중해라. MyBatis에서도 alias와 같이 이러한 네이밍 컨벤션의 간극을 해결하기 위한 방법을 제공한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.