Java/Spring

Hikaricp, log4jdbc, MapperFactoryBean 7/28실습

amungstudy 2023. 7. 31. 12:18

필요한 db 설정 정보:

properties 파일에 db관련 정보 등록.

 

db.properties파일 -> 

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/digital_spring
jdbc.username=digital
jdbc.password=12345

 

root-context.xml 파일에 해당 내용 추가 ->

<!-- 지정된 위치의 properties파일을 read하는 class : properties에 등록된 key값으로 value값불러올 수 있다. -->
<context:property-placeholder location="classpath:prop/*.properties"/>

 

Hikaricp 커넥션 풀 라이브러리

1. MAVEN 코드 pom.xml에 입력.

2. root-context.xml 파일에 해당 내용 추가 ->

<!-- Hikari 설정 정보 class -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 최대로 생성 유지할 수 있는 커넥션 개수 default=10 -->
<property name="maximumPoolSize" value="200"/>
<!-- 일을 하지 않아도 유지되는 최소 connection 수 -->
<property name="minimumIdle" value="20"/>
<!-- pool에서 connection 정보를 가져오기 위해 대기하는 시간 default=250ms -->
<property name="connectionTimeout" value="300000"/>
<!-- 일을 하지 않는 connection을 대기(유지)하는 시간 default="60000ms" -->
<property name="idleTimeout" value="200000"/>
</bean>
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig"/>
</bean>

 

로그기록을 자동으로 남겨주는 log4jdbc생성 (Log4Jdbc Log4j2)

MAVEN 라이브러리 추가
Log4Jdbc Log4j2 


src/main/resources/log4jdbc.log4j2.properties 생성 ->
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator



db/properties에 내용 추가->
jdbc.log4j.driver=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc.log4j.url=jdbc:log4jdbc:mysql://localhost:3306/digital_spring


root-context.xml에 내용변경 ->
<!-- log4j slf4j를 이용한 db log 출력 -->
<property name="driverClassName" value="${jdbc.log4j.driver}" />
<property name="jdbcUrl" value="${jdbc.log4j.url}"/>

DAO 구현객체 이용안하고 인터페이스로 Mapper 바로 연결 :

mybatis에서 하는 것.

 

인터페이스랑 [id가 메소드 이름, 파라미터 타입, 리턴타입 ]일치하게 mapper에 등록하면 bean으로 등록 된다. 

1. MyBatis 설정 파일 삭제 

2. root-context.xml 내용 입력 ->

<bean id="factory" 
  class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds" />
<!-- 지정한 패키지 내의 클래스명 첫글자만 소문자로 변경해서 별칭등록 -->
<property name="typeAliasesPackage" value="com.bitc.board.vo, com.bitc.board.util"/>
<property name="mapperLocations" value="classpath:mybatis/sql/*.xml"/>
</bean>

src/test/java 에서 사용예시)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {
"classpath:/context/root/root-context.xml"
})
public class MyBatisTest {

@Autowired
SqlSession sqlSession;

@Test
public void readBoard() {
BoardVO vo = sqlSession.selectOne("boardMapper.read",1);
System.out.println(vo);
}

3. MAPPER 파일 수정 ->

<!--   namespace를 인터페이스경로와 동일하게 수정 -->
<mapper namespace="com.bitc.board.dao.BoardDAO">

 

 

4. 패키지단위로 Mapper 등록

 

root-context.xml에 코드 추가

<mybatis-spring:scan base-package="com.bitc.*.dao"/>

 

더보기

만약, 다른 인터페이스와 섞여 있는 경우

<!-- 스캔할 패키지 지정. annotation이 지정된것만 스캔함. -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="com.bitc.*.dao"/>
     <property name="annotationClass" value="org.apache.ibatis.annotations.Mapper"/>
    </bean>

사용할 인터페이스에 @Mapper 추가

ex.)

@Mapper
public interface BoardDAO{


실습 파일 수업

 

<form method="POST"> form 태그에 action 지정이 안되어 있으면 동일한 url요청 경로에 전송방식만 POST로 요청감 

 

RedirectAttributes : redirect된 페이지에 값을 실어줌. 객체 전달 가능

@PostMapping("register")
public String registerPost(BoardVO vo,
//HttpSession session
//RedirectAttributes : redirect된 페이지에 값을 실어줌
RedirectAttributes rttr)throws Exception{
System.out.println("board/register POST 요청");
String result = bs.regist(vo);
//session.setAttribute("message", result);
rttr.addFlashAttribute("result",result);
return "redirect:/board/listPage";
}

 

rttr.addAttribute("bno",vo.getBno()); // get방식으로 파라미터값 삽입. 객체 전달 불가

@PostMapping("modify")
public String modify(
RedirectAttributes rttr,
BoardVO vo)throws Exception{
String result = bs.modify(vo);
rttr.addFlashAttribute("result",result);
rttr.addAttribute("bno",vo.getBno()); // get방식으로 파라미터값 삽입.
return "redirect:/board/readPage";//?bno="+vo.getBno();
}

 

UriComponents : spring에서 지원하는 쿼리스트링. 객체형식으로 완성해줌

public String mkQueryStr(int page) {
UriComponents uriComponents 
= UriComponentsBuilder.newInstance()
  .queryParam("page",page)
  .queryParam("perPageNum", cri.getPerPageNum())
  .build();
String query = uriComponents.toUriString();
System.out.println(query);
return query;
}

 

@ModelAttribute("key값") : 파라미터로 넘겨받은걸 바로 Model에 넣어줌

이거 안해도 자동으로 실림 (대신 맨앞글자 소문자로 바꾼 이름으로 실림)

 

@GetMapping("readPage")
public String readPage(
//model.addAttribute("cri",cri);
@ModelAttribute("cri") Criteria cri,
int bno, Model model) throws Exception {
// 조회수 증가
bs.updateCnt(bno);
// 상세보기 요청 게시글 정보
BoardVO vo = bs.read(bno);
model.addAttribute("boardVO",vo);
return "/board/read";
}

 

 

 

-이동한 페이지가 LIST로 이동했을 때 유지되도록 코드 수정함 (read.jsp)

<div>
<a href="" id="modify">MODIFY</a> |
<a href="" id="remove">DELETE</a> |
<a href="" id="list">LIST</a>
</div>
<form id="submitForm" method="POST">
<input type="hidden" name="bno" value="${boardVO.bno}" />
<input type="hidden" name="page" value="${cri.page}" />
<input type="hidden" name="perPageNum" value="${cri.perPageNum}" />
</form>
<script>
var result = '${result}';
if(result != null && result != ''){
alert(result);
}
</script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
// 문서가 모두 로드 되었을 때 실행...
$(function(){

var formObj = $("#submitForm");

$("#list").click(function(e){
e.preventDefault();
$("input[name='bno']").remove();
formObj.attr("action","listPage");
formObj.attr("method","GET");
formObj.submit();
});

});
</script>

 

ㄹㅇㄹ