CLASS/SPRINGBOOT

#2-3 / AOP+springboot+로그기록(aop에서 dao 값 가져오기)

hingu 2024. 8. 13. 12:52

table 만듬

user table - 원래 잇던거 이건 로그인 정보 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에 넣는게 정통! => 뚫림 방지

요걸로 설정해둔게 있어서 mapper에만 넣으면 알아서 잘 작동됨 - application.properties

 

- 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에서

두개 쓸땐 이렇게 따로 작성하면 됨ㅋ