[Spring Boot] properties

yihyun·2024년 9월 26일

Spring Boot

목록 보기
25/33

properties

Spring boot 를 사용할 때 application.properties 에 다양한 설정을 해두면 많은 기능을 편리하게 사용할 수 있다.

가장 많이 사용하는 경우는 MyBatis 를 사용할 때 DB를 연결하는데 사용을 해준다.

✔ 설정을 하는 이유

  • 만약 2개의 DB를 연결해야 하면 굉장히 복잡해진다. (별도로 연결하기 위한 코드가 많이 필요하다.)
  • 하지만 설정을 해두면 어떤 DB에 연결을 하던 application.properties에서 끌어오게 되기 때문에 결합도가 낮아진다.
  • 스프링에서 내부적으로 어플리케이션에 설정하면 자동으로 불러와서 설정을 하는 것이고 이를 제어 역전 이라고 한다.

반대로 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 {
}
  • classpath : 실제로 동작되는 프로그램 경로를 의미한다.

그렇다면 어떤 상황에서 사용을 할까??
예시를 통해 코드를 살펴보자!

✅ 가정
관리자 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; : 설정한 정보 가져오기

이후 작업은 기존 로그인과 동일하게 진행해주면 된다.

profile
개발자가 되어보자

0개의 댓글