DAY-81 Spring 스케줄러(자동 삭제), myBatis 시작
💻2022-06-28
❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음
2️⃣ myBatis 시작
1) 라이브러리 추가
- mybatis
- mybatis-spring
- spring-jdbc
- ojdbc8
- dbcp2
2)코드
root-context.xml
MessageDAO
- myBatis를 사용하기 위해 3개의 bean을 연결시켜 주고 생성해야 한다.
- myBatis를 활용하려면 private BasicDataSource bds; 코드를 이용하지 않고 SqlSession session을 사용한다
- DAO에서는 어떤 쿼리문을 실행 시킬거고 그 쿼리문을 실행시키기 위해 필요한 데이터가 있다면 그 데이터만 넘겨주고 결과를 반환 받는다.
message-mapper.xml
- 해당 경로의 폴더로 생성해줘야 한다
🔔 쿼리문의 태그자의 속성
- id : dao에서 쿼리문을 호출하기 위해 사용하는 이름
-
parameterType : DAO에서 보낸 인자값의 자료형을 명시
- 만약 인자값이 객체의 형태라면 parameterType에 반드시 자료형을 명시(패키지명까지 입력)
- 만약 인자값이 기본형이면 parameterType을 명시하지 않아도 된다.
- resultType : DAO로 return 시켜줄 데이터의 타입
🧨 주의
- 모든 쿼리문은
안에서 사용한다. -
에는 namespace를 쿼리문에는 id를 부여한다 → DAO에서 사용 - ❗ myBatis에서 세미클론은 넣지 않는다
🔔 넘겨받은 데이터를 쿼리문에서 셋팅하는 방법
-
#{변수명} : 인자값이 String 값으로 들어옴
1)String으로 값이 오기에 자동적으로 ‘ ‘ 식으로 감싸진다
2)PreparedStatement는 인자값을 문자열로 셋팅 (sql injection 예방)
3)일반적인 경우 사용
4)#{변수명} -> 변수명의 getter를 dto에서 알아서 찾아준다
-
${변수명} : 인자값을 셋팅하려는 컬럼의 자료형에 맞춰서 자동으로 인자값의 자료형이 변환
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
- 서버에 남아 있는 파일 목록을 받아온다 File[] files_root = new File(path).listFiles();
- db에 남아있는 파일 목록을 받아온다 List
files_db = dao.selectSys_name(); - 서버에는 있는데 db에는 없는 파일들을 찾아내서 그 부분들만 삭제 시켜준다. 이때 contains 메서드를 사용하는데 결과값은 true / false로 반환된다
FileDAO.java
Leave a comment