DAY-81 Spring 스케줄러(자동 삭제), myBatis 시작

3 minute read

💻2022-06-28

❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음

2️⃣ myBatis 시작

1) 라이브러리 추가

  1. mybatis
  2. mybatis-spring
  3. spring-jdbc
  4. ojdbc8
  5. dbcp2

2)코드

root-context.xml

MessageDAO

  • myBatis를 사용하기 위해 3개의 bean을 연결시켜 주고 생성해야 한다.
  • myBatis를 활용하려면 private BasicDataSource bds; 코드를 이용하지 않고 SqlSession session을 사용한다
  • DAO에서는 어떤 쿼리문을 실행 시킬거고 그 쿼리문을 실행시키기 위해 필요한 데이터가 있다면 그 데이터만 넘겨주고 결과를 반환 받는다.

message-mapper.xml

  • 해당 경로의 폴더로 생성해줘야 한다

1.png

🔔 쿼리문의 태그자의 속성

  • id : dao에서 쿼리문을 호출하기 위해 사용하는 이름
  • parameterType : DAO에서 보낸 인자값의 자료형을 명시

    1. 만약 인자값이 객체의 형태라면 parameterType에 반드시 자료형을 명시(패키지명까지 입력)
    2. 만약 인자값이 기본형이면 parameterType을 명시하지 않아도 된다.
  • resultType : DAO로 return 시켜줄 데이터의 타입

🧨 주의

  • 모든 쿼리문은 안에서 사용한다.
  • 에는 namespace를 쿼리문에는 id를 부여한다 → DAO에서 사용
  • ❗ myBatis에서 세미클론은 넣지 않는다

🔔 넘겨받은 데이터를 쿼리문에서 셋팅하는 방법

  1. #{변수명} : 인자값이 String 값으로 들어옴

    1)String으로 값이 오기에 자동적으로 ‘ ‘ 식으로 감싸진다

    2)PreparedStatement는 인자값을 문자열로 셋팅 (sql injection 예방)

    3)일반적인 경우 사용

    4)#{변수명} -> 변수명의 getter를 dto에서 알아서 찾아준다

  2. ${변수명} : 인자값을 셋팅하려는 컬럼의 자료형에 맞춰서 자동으로 인자값의 자료형이 변환

    1)Statement 객체와 유사 (sql injection 예방)

    2)테이블명이나 컬럼명을 동적으로 셋팅 해주는 경우 사용 -> 검색 기능 때 활용

  • 일반적인 경우 대부분은 #{} 을 사용한다.

3)SELECT, INSERT , UPDATE, DELETE

1) 🔔 select

  • selectOne : 하나의 값을 가져오려면
  • selectList : 다중값 가져오기

🔎 하나의 데이터만 조회

message-mapper.xml

<!-- 하나의 메세지 조회 -->
<select id="selectOne" parameterType="int" resultType="kh.message.dto.MessageDTO">
	select * from msg where no = #{no}
</select>
  • message-mapper.xml에서 실행한 결과의 반환타입을 resultType에 설정해준다. 이때 반환타입이 DTO 이면 패키지명까지 써준다.
  • resultType에 DTO 타입을 명시하게 되면 DTO 클래스가 가지고 있는 setter / 인자값 받는 생성자를 활용하여 컬럼명과 동일한 맴버필드에 값을 셋팅하게 된다. (자동으로 컬럼명에 맞는 값들을 dto에서 찾아서 값을 넣어준다)

HomeController

MessageService

MessageDAO

  • 의 namespace . 쿼리문의 id를 selectOne 메서드에 인자로 넣는다
  • message-mapper에 보내줄 값도 함께 인자로 넣어준다

🔎 여러 데이터 조회

message-mapper.xml

<!-- 전체 메세지 조회 -->
<!-- 전체 조회이기 때문에 넘겨주는 parameter 값이 없다 -->
<select id="selectList" resultType="kh.message.dto.MessageDTO">
	select * from msg
</select>
  • 여러 개를 조회하지만 myBatis가 알아서 list에 값을 하나씩 담아준다 → 즉 while문 필요가 없다
  • 다중행의 데이터를 반환하는 경우 resultType은 한행의 데이터를 받아줄 수 있는 자료형으로 구성해두고 dao에서 selectList 메서드를 사용하면서 알아서 resultType List로 조회된 데이터를 반환해준다

HomeController

MessageService

MessageDAO

2) 🔔 insert

message-mapper.xml

<!-- 메세지 저장 -->
<insert id="insert" parameterType="kh.message.dto.MessageDTO">
	insert into msg values(seq_msg.nextval, #{nickname}, #{message})
</insert>

3) 🔔 update

message-mapper.xml

<!-- 메세지 수정 -->
<update id="update" parameterType="kh.message.dto.MessageDTO">
	update msg set nickname = #{nickname}, message = #{message} where no = #{no}
</update>

4) 🔔 delete

message-mapper.xml

<!-- 메세지 삭제 -->
<delete id="delete" parameterType="int">
	delete from msg where no = #{no}
</delete>

2️⃣ Scheduler

🔔 환경 설정

servlet-context → Namespaces → task 체크

servlet-context → task:annotation-driven/ 넣어주기

🔔 cron 표현식

스케쥴러에게 어느 주기마다 스케쥴러 동작시킬건지에 대한 시간 표현식

// 해당 메서드를 인자로 넘겨준 표현식에 따른 주기마다 실행시키겠다는 어노테이션
// * * * * * * * = 초 분 시 일 월 요일
@Scheduled(cron="* * * * * *")
public void test() {
	System.out.println("스케쥴러 동작");
}
 : 0~59
 : 0~59
 : 0~23
 : 1~31
 : 1~12
요일 : 0(일요일)~6(토요일) / MON, WED, FRI
* : 모든 시간을 대체
0/3 : 3초마다 실행 여기서 0이라는건 ~마다 ex)  초마다  분마다  시간마다

ex)

@Scheduled(cron="30 * * * * *")
	public void test() {
		System.out.println("매분 스케쥴러 동작");
}
  • 매분 30초 마다 실행(15분 30초, 16분 30초)

🔔 코드

Scheduler.java

  • 2초 마다 실행 (실제로는 기간을 잘 설정해서 해야한다)

FileService.java

  1. 서버에 남아 있는 파일 목록을 받아온다 File[] files_root = new File(path).listFiles();
  2. db에 남아있는 파일 목록을 받아온다 List files_db = dao.selectSys_name();
  3. 서버에는 있는데 db에는 없는 파일들을 찾아내서 그 부분들만 삭제 시켜준다. 이때 contains 메서드를 사용하는데 결과값은 true / false로 반환된다

FileDAO.java

Categories:

Updated:

Leave a comment