#2-3 / AOP+springboot+로그기록(aop에서 dao 값 가져오기)
table 만듬
create table user_log(
log_idx int(8) not null auto_increment,
log_uid varchar(100) not null,
log_time timestamp not null default current_timestamp,
primary key(log_idx)
)
=> 이건 log 기록 table
- login.jsp
암호화는 생략
<body>
<form id="frm" action="./loginok.do" method="post">
아이디 : <input type="text" name="uid" oninvalid="this.setCutomValidity('아이디를 입력하세요')" required><br>
패스워드 : <input type="password" name="upass" required><br>
<input type="submit" value="로그인">
</form>
</body>
- mapper2.xml - mybatis xml로 또만들면됨
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.co.sen.userRepository">
<!-- id검토만 함 -->
<select id="getlogin" resultType="kr.co.sen.user_dao">
select uid,uname,upass from user where uid=#{uid} order by uidx desc
</select>
</mapper>
비밀번호 확인은 if에 넣는게 정통! => 뚫림 방지
- userRepasitory.java (interface)
package kr.co.sen;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface userRepository {
List<user_dao> getlogin(String uid);
}
mappr id와 동일하게!
- userService.java (interface)
package kr.co.sen;
import java.util.List;
public interface userService {
public List<user_dao> check_login(String uid);
}
- userServiceImpl.java => 걍 class
package kr.co.sen;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class userServiceImpl implements userService{
@Autowired
private userRepository ur;
@Override
public List<user_dao> check_login(String uid) {
return ur.getlogin(uid);
}
}
🔽 로그인 제작 후 -> 로그기록 기능 추가한다면
(갑자기 수정필요한데 본코드에 이상이 생기면 안되는 경우....)
controller있는 값을 끌고와서 뭔가하는건 불가능 - dao.getUid 뭐 이렁거..
controller->aop 는 불가능 / aop->controller 는 가능
자체적으로 작동시킬 게 있는 경우에 사용!
but ❗
dao.java에 annotation 추가하면 getter,setter도 가져다 쓸 수 있음!!
(단, aop에서는 controller에서 setter로 태워 보내서 다시 가져와야함 )
- Cotroller - 위 controller에서 수정
package kr.co.sen;
//import 생략
@Controller
public class main_controller {
@Autowired
private userService user_service;
@Resource(name="userdao")
user_dao dao;
PrintWriter pw = null;
@PostMapping("/loginok.do")
public String loginok(
HttpServletResponse res,
HttpServletRequest req,
@RequestParam(value="", required=true) String uid,
@RequestParam(value="", required=true) String upass) {
//무조건 dao로 받아야하는거 아님 - 나중에 dao가 꼬여버릴 수 있음
res.setContentType("text/html;charset=utf-8");
try {
this.pw = res.getWriter();
List<user_dao> one = user_service.check_login(uid);
int ea = one.size();
if(ea == 0) { //id가 없는 경우
this.pw.print("<script>"
+ "alert('아이디 및 패스워드를 다시 확인하세요.');"
+ "history.go(-1);"
+ "</script>");
}else { //id가 일치하는 경우
if(upass.equals(one.get(0).getUpass())) { //비밀번호 비교
this.pw.print("<script>"
+ "alert('로그인 성공');"
+ "location.href='./list.do';"
+ "</script>");
//AOP 추가 코드를 작성하여 프로그램을 활성화
this.dao.setAop_uid(one.get(0).getUid());
}else {
this.pw.print("<script>"
+ "alert('아이디 및 패스워드를 다시 확인하세요.');"
+ "history.go(-1);"
+ "</script>");
}
}
//aop가 여기서 작동되는거임
}catch(IOException e) {
e.printStackTrace();
}finally {
this.pw.close();
}
return null;
}
}
Controller에서 입력받은 값을
setter로 태운 뒤
다시 AOP에서 getter로 가져옴
- logaspect2 : 아까 만들어둔 AOP - session 제작되는 aop
package kr.co.sen;
//import 생략
@Aspect
@Component
@Slf4j //로그 기록을 담당하는 어노테이션
public class logaspect2 {
//AOP class는 controller와 관계없이 프로젝트 실행시 무조건 실행하는 Module!
@Resource(name="userdao")
user_dao dao;
@Autowired //database를 활용하기 위함
userService us;
//login 메소드에 대한 추가 코드사항
@After("execution(* kr.co.sen.main_controller.loginok(..))")
public void loginaop() throws Throwable { //()안에 user_dao dao 이거 못들고옴...
try {
//aop에 Request 사용하는 방식 - 여기서 사용은 x 알고만 있으숑
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
//Controller => DAO => setter값을 getter로 받는 코드
String uid = this.dao.getAop_uid();
if(uid!=null) {
int result = us.setlogin_log(uid);
if(result==0) {
//실제 서버에 남김 - @Slf4j 얘가 꼭 있어야함
log.info("database log table 오류로 인하여 저장 실패");
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
- user_dao.java
package kr.co.sen;
import org.springframework.stereotype.Repository;
import jakarta.annotation.Resource;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Repository("userdao") //@Resouce : class 로드할때 / @Repository : class 내보낼 때
public class user_dao {
int uidx;
String uid,upass,uname,uemail,ujoin;
//AOP에서 활용할 변수
String aop_uid;
}
⭐ @Resouce : class 로드할때 / @Repository : class 내보낼 때
- mapper에 추가
<insert id="setlogin_log" parameterType="String">
insert into user_log values ('0',#{log_uid},now());
</insert>
- 각 파일 요렇게 추가..ㅋ
//uerRepository.java - interface
@Mapper
public interface userRepository {
List<user_dao> getlogin(String uid); //로그인
int setlogin_log(String log_uid); //로그인 후 로그기록
}
//userService.java - interface
public interface userService {
public List<user_dao> check_login(String uid); //로그인
int setlogin_log(String log_uid); //로그인 후 로그기록
}
//userserviceImpl.java - class
@Service
public class userServiceImpl implements userService{
@Autowired
private userRepository ur;
@Override
public List<user_dao> check_login(String uid) {
return ur.getlogin(uid);
} //로그인
@Override
public int setlogin_log(String log_uid) {
int result = ur.setlogin_log(log_uid);
return result;
} //로그인 후 로그기록
}
참고 ) controller에서