properties
Spring boot 를 사용할 때 application.properties 에 다양한 설정을 해두면 많은 기능을 편리하게 사용할 수 있다.
가장 많이 사용하는 경우는 MyBatis 를 사용할 때 DB를 연결하는데 사용을 해준다.
✔ 설정을 하는 이유
반대로 application.properties 에 설정된 내용을 가져와 사용할 수도 있다.
❌ 여러 파일 생성 가능하다.
기존 설정
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
사용자 임의 설정
upload.path = C:/upload/
📌 사용 방법
@Value("${가져올 설정 이름}") 타입 변수명;
@Value("${upload.path}") String path; // 사용자 지정
@Value("${spring.application.name}") String name;
@Value("${spring.mvc.view.prefix}") String prefix; // 제공
@Value("${spring.mvc.view.suffix}") String suffix; // 제공
이렇게 작성해서 logger 로 찍어보면 application.properties 에서 설정한 내용을 가져온 것을 확인할 수 있다.
만약 application.properties 에 설정된 내용을 아닌 별도의 properties 를 만들었다면 @PropertySource("경로") 를 class 위에 선언해줘야 한다.
@Service
@PropertySource("classpath:super_admin.properties")
public class MainService {
}
그렇다면 어떤 상황에서 사용을 할까??
예시를 통해 코드를 살펴보자!
✅ 가정
관리자 id, pw, ip를 super_admin.properties 에 설정해두고, 관리자로 로그인할 경우 properties 에서 정보를 끌고와 ip, pw, ip 가 일치할 경우 관리자 권한으로 로그인을 시켜준다.
▶ properties가 아닌 DB에 설정을 해주는게 일반적인 상황이기는 하다!
1) 먼저 properties 를 생성해 관리자 관련 정보를 입력한다.
user.ip= 127.0.0.1
user.id= superAdmin
user.pw= pass@Goodee
2) 이후 로그인 페이지를 만들어 준다.
<body>
<h3>main page</h3>
<form action="login.do" method="post">
<table>
<tr>
<th>ID</th>
<td><input type="text" name="id" value=""/></td>
</tr>
<tr>
<th>PW</th>
<td><input type="text" name="pw" value=""/></td>
</tr>
<tr>
<th colspan="2">
<input type="radio" name="option" value="user" checked="checked"/> 일반 사용자
<input type="radio" name="option" value="admin"/> 관리자
</th>
<tr>
<th colspan="2">
<button>로그인</button>
</th>
</tr>
</table>
</form>
</body>
3) 로그인 페이지에서 보내는 파라미터를 받아준다.
ip 정보를 확인해야 하기 때문에 Request로 받아준다.
@PostMapping(value="/login.do")
public String login(HttpServletRequest req, Model model) {
String page = "main";
String msg = "아이디 또는 비밀번호를 확인하세요";
String id = req.getParameter("id");
String pw = req.getParameter("pw");
String ip = req.getRemoteAddr();
String opt = req.getParameter("option");
logger.info(id + " / " +pw + " / " + ip + " / " + opt);
if(main_service.login(id,pw,ip,opt)) {
HttpSession session = req.getSession(); // 이렇게도 가져올 수 있다.
session.setAttribute("loginId", id);
session.setAttribute("perm", opt);
msg = "로그인에 성공했습니다.";
}
model.addAttribute("msg", msg);
return page;
}
.getRemoteAddr() : ip가 v6로 나온다.
Request 는 한글이 깨질 수 있기 때문에 그럴 경우 인코딩을 해줘야 한다.
Request 객체가 있으면 파라미터도 받을 수 있다. (따로 받을 수도 있다.)
option 이 admin 이면 properties로 부터 값을 가져올 것이다.
4) 서비스에서 properties에서 값을 가져와 비교해준다.
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import kr.co.gudi.dao.MainDAO;
@Service
@PropertySource("classpath:super_admin.properties")
public class MainService {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired MainDAO main_dao;
@Value("${user.id}") private String user_id;
@Value("${user.pw}") private String user_pw;
@Value("${user.ip}") private String user_ip;
public boolean login(String id, String pw, String ip, String opt) {
boolean success = false;
if(opt.equals("admin")) {
// super_admin.properties를 이용
logger.info(user_id +" / "+ user_pw+" / "+user_ip);
if(id.equals(user_id) && pw.equals(user_pw) && ip.equals(user_ip)) {
success = true;
}
}else {
if(main_dao.login(id, pw) != null){
success = true;
}
}
return success;
}
}
@PropertySource("classpath:super_admin.properties") : 생성한 properties 와 연결@Value("${user.id}") private String user_id; : 설정한 정보 가져오기이후 작업은 기존 로그인과 동일하게 진행해주면 된다.