본문 바로가기

Back-end(Spring Framework)/필기일지

231206 [Back-end] Spring Framework/ JDBC(스프링 프레임워크)/ SpringJdbc/ 마이바티스 mybatis/ 실제 class 파일의 output경로

[23.12.06]  82차 

 

<<진도>>

[Back-end] Spring Framework

/ JDBC(스프링 프레임워크)

/ SpringJdbc

/ 마이바티스 mybatis

/ 실제 class 파일의 output경로

 

<<오늘의 팁>>

 

 

- MySQL에서 쿼리 작성 후 먼저체크한 후에 가져다쓰는게 좋다

- [eclipse] 블럭지정 후 ctrl + shift + x 선택영역 모두 대문자.

- [eclipse] html, xml파일에서 자동정렬을 하면 줄이 꼬이는 현상 너비 설정 때문에 그렇다 Line width 수정

preference- XML - XML Files - Editor

 

[ Spring Framework ]

< MemberSpringJdbcRepository >

DI방식에 따라 root-context.xml Bean 생성설정이 다르다.

 

 


 

[마이바티스 사용]

 

/ root-context.xml 에서

	<bean id="repository" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="himedia.project.ver2.repository.MemberRepository" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

태그통해 리포지토리 Bean을 생성해주고

 

source- resource - ver2 - mapper

 

/ member-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="himedia.project.ver2.repository.MemberRepository">
	
	<insert id="save" useGeneratedKeys="true" keyProperty="id" parameterType="himedia.project.ver2.dto.Member" >
		insert into member(name) values(#{id})
	</insert>
	
	<select id="findById" parameterType="Long" resultType="himedia.project.ver2.dto.Member">
		select * from member where id = #{id}
	</select>
	  
	<select id="findByName" parameterType="String" resultType="himedia.project.ver2.dto.Member">
		select * from member where name = #{name} limit 1
	</select>  
	
	<select id="findAll">
		select * from member
	</select>  
</mapper>

 

MemberRepository interface를 태그형태로 구현하는 마이바티스

 

- save()

현재 save()를 구현한 태그에서오류가 뜨는데

마이바티스 <insert>문은 int 정수형 또는 void 형태로 return을 하므로

구현 전의 interface의 save()의 타입(기존 Member같은 클래스 형태는 원래 반환 불가능) 때문에 발생하는 문제

따라서 마이바티스(, JPA)는 기본키id값 '정수'형태나 'void'형태로 보통 구현

 

- findByID/Name()

정보 연결

여러개의 ROW중 1개만 return하고 싶을 때.

쿼리문에서의 limit 1 처리가 가장 깔끔하다.

("limit 1"이 없으면 자바에서 추가로 리턴값을 가지고 추가로 값 1개만 뽑는 코드가 필요해짐)

 

 

- findAll은 정적쿼리라 parameterType 필요없지만, resultType은 써주는게 좋다

<select id="findAll"> : (안써줘도 마이바티스가 추정해서 실행됨)

 

***주의) 마이바티스에서 쿼리문의 파라미터( #{parameter} )는 소문자로 작성해야한다..!

parameter들은 소문자 => 쿼리에 파라미터 대문자면 Error

 


 

< Packagea Explorer와 Project Explorer >

project explorer는 작업에 용이하게 직접 추가 하는 형식이고,실제 실행이 되는 형태는 Package Explorer의 형태에 가깝다.

project eplorer의 .java파일에 실제 .class들이 있지는 않다

 

프로젝트 속성 - Java build path -source tap

(Explorer상단의 Flat형태로 보여지는 부분과 동일)

 

 

위의 Java Build Path의 하단 output folder 경로에 클래스 파일(java파일이 아닌 실제 실행되는 class파일)들이 저장된다.

explorer에는 target에 하위 classes가 보이지 않으나

 

경로의 실제 폴더에 가보면 classes폴더 존재 하위경로에 .class 파일들이 있다.

 

 

1. [src] 실제 개발을 할 때 환경. 여기서 .java파일을 만듦

2. [target] 실제로 실행이되는 .class 파일 들이 있는 경로 (compile컴파일 후에 자동적으로 만들어지는 경로)

 

따라서 root-context.xml에서도 .src의 경로가아니라

Build Path의 output folder 경로(spring-ver2/target/classes)

이후의 target폴더 내의 .class파일을 찾아가는 경로를 입력하는 것 ( 실제 실행이 되는 파일의 경로 )

(.java파일의 경로를 넣으면 Error !)

spring-ver2/target/classes/himedia/project/ver2/repository의 MemberRepository.class

 

mapper.xml도 실제 실행되는 파일은 target-classes내의 파일

 


 

web.xml 스캔 코드는 Tomcat에서 관리

web.xml에는 프로그램이 실행이되면서 root-context.xml을 스캔하라는 코드

root-context는 Back단과 관련된 Bean생성과 관련된 코드들을 넣어주고,

 

또 web.xml에는

appication 외부 request요청이 들어올때 DispatcherServlet을 통해 servlet-context.xml을 스캔

앱의 구동과 관련이 된 front단과 관련된 view들을 처리(ViewResolver) 

 

servlet-context.xml의 component-scan코드는 해당 경로(target/classes/)에서

"/" url 명령을 처리해 줄 핸들러메서드(컨트롤러) handlerMethod (Controller)를 찾는데

 

해당 controller를 찾고 나면 view를 처리하기 위해 다시 servlet.xml로 가서 ViewResolver를 통해 처리하는 구조

 

*** target에는 back-end와 관련된 class파일들이 존재 (view와 관련된 파일들은 존재하지 않는다!)

 


** (Mybatis) mapper의 경로를 좀더 간략화 하는 방법

/ member-config : 아래 mapper파일의 설정파일

resouce - ver2의 하위 package(config, mapper)에 생성