웹 개발 Spring Day8 Mapper

김지원·2022년 8월 4일
0

WebDevelop2

목록 보기
27/34

Dao

Connection
Preparestatement
ResultSet

여기서 작업상의 부화율이 가장 높은 것은 데이터를 가져오고 처리해주는 Connection이 가장 높다. Request가 들어와서 조치를 취해주고 응답이 나가는데까지 걸리는 시간 중 DB가 가장 오래 걸리는데 Connection을 열어주는데 꽤 걸리기 때문이다. 이것을 줄이면 좋을 것 같다.
응답시간이 느려진다는 것은 우리가 웹브라우저를 사용할 때 빙글 빙글 돌아가는 그 시간이 긴 것을 의미한다.

지금까지는 JVM과 DBMS간의 연결을 요청이 있을 때 마다 열고, 다 쓴 뒤 닫는방법을 사용했다.


DBCP(Database Connnection Pool)

: JVM과 DBMS간의 연결을 요청이 있을 때 마다 열고, 다 쓴 뒤 닫는게 아니라, 서버가 켜질때 설정에서 지정한 개수 만큼의 Connection을 미리 다 열어놓고 필요할때 빌려주고 닫지 않고 돌려 받는 것.

  • HikariCP 사용 (빛 만큼 빠르다 라는 의미..)
서버가 켜질때 : 구동을 시킬 때는 아니고 최초의 요청이 있을 때지만 저렇게 표현하였다.

DB랑 연결되는 Connection 객체가 5개있다고 했을 때 5개 전부 다 열어 놓는다고 생각하자. Dao가 필요할때 빌려주고 close() 하는 것을 재정의해서 닫는게 아니라 다시 돌려 받는 형식이다.
DB랑 연결하는 시간에서 Connection을 여는 시간이 아얘 사라짐으로 빨라지게 된다.

  • HikariCP가 압도적으로 빠르다.

ORM(Object Relational Model)

객체 관계 모델
: Java 객체와 DBMS 구성요소간의 상호 작용을 매우 쉽게해준다.

  • MyBatis 사용 : 얘를 사용하면 Dao를 전혀 사용하지 않는다.
  • 내부적으로는 Connection, Preparestatement, ResultSet을 사용하는 것임으로 잊으면 안된다.

study-member 새 프로젝트 생성.

의존성

(junit) junit

: 단위 테스트

(org.mariadb.jdbc) mariadb-java-client

: MariaDB에 접속하기 위해 사용하는 커넥터

(mysql) mysql-connector-java

: MySQL에 접속하기 위해 사용하는 커넥터

(org.springframework.boot) spring-boot-starter-jdbc

: Spring Boot를 통해 DBMS에 접근하기 위해 사용. DBCP 포함

(org.mybatis.spring.boot) mybatis-spring-boot-starter

: MyBatis ORM을 사용하기 위한 의존성


DataSource

application.properties 1

src/main/resources/application.properties 파일에 접속하고자하는 데이터베이스의 정보를 제공한다.

→ spring.datasource.driver-class-name
→ spring.datasource.url
→ spring.datasource.username
→ spring.datasource.password

application.properties 2

src/main/resources/application.properties 파일에 MyBatis ORM의 쿼리 XML 위치를 지정한다.

→ mybatis.mapper-locations=classpath:mappers/**/*.xml

  • 여기서 작성한 classpath = resources 이다.

XML Templates 지정해놓는 방법

https://mybatis.org/mybatis-3/ko/getting-started.html

  • 복붙해서 내가 필요한 것만 남긴다.
  • shift 2번 File and Code Templates

참고) 스프링이 관리하는 모든 것들을 bean이라고 한다.

  • 얘!!!

-> HomeController-> TestService
-> DB추가
-> TestEntity

-> TestEntity > getTestEntity

-> ITestMapper

  • 인터페이스 → 구현부를 작성하지 않는다.

  • TestService은 ITestMapper에 의존적이다. spring이 알아서 객체화하도록 @Autowired 추가.

-> HomeController

  • HomeController는 TestService에 의존적이다.

의존적인걸 어떻게 아느냐가 아니라 필요하면 의존적이게 되는 것이다.

  • TestService에서 testMapper의 select 리턴해준다.
    이 인터페이스의 select가 돌려주는 값 자체를 돌려준다.

-> HomeController

mapper -> service -> controller 방식을 벗어나지 않는다.


TestMapper.xml

  • mapper의 namespace에 ITestMapper의 풀네임을 적는다.
    ❗️ command 클릭 시 이동 되어야지 잘 적은 것이다.

<select id="select" resultType="dev.jwkim.studymember.entities.TestEntity">
id 속성         : 메서드 이름
resultType 속성 : 어떤 응답결과를 줘야되는지에 대해서 명시를 해주는데 
풀네임으로 작성해야하며 select할 때만 사용한다.
이 메서드의 반환타입이 있기 때문에 반환타입을 명시해준다.

  • 쿼리 작성!

  • localhost 로 들어가면 이렇게 뜨게 된다.

MyBatis가 알아서 어떻게 select를 한걸까?
즉, mapper에 있는게 Entity의 멤버변수에 들어갔을까?

index     → Index       → setIndex 
          ↑ 파스칼케이싱   ↑ set붙인 메서드를 MyBatis가 찾는다.

해당 메서드를 찾아서 값을 전달해준다.
별명만 멤버변수랑 똑같이 적어주면 된다❗️

profile
Software Developer : -)

0개의 댓글