드디어 배우는 스케줄러! 세미프로젝트 때 구독 시스템 만드려고 필요했는데 이후에 배울 테니 사용하지 말라고 해서 기다렸었다. 다음 프로젝트에서 사용해야지🎶
라고 생각했는데 정말 별거 없이 넘어갔다... 부트에서는 간단하게 사용 가능한데, spring에서 하려면 어떻게 하는지는 따로 알아봐야 할 것 같다😐
가짜 톰캣 위치 : C:\STUDY\15_BOOT.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
진짜 톰캣 위치 : 톰캣 설치한 위치 (C:\apache-tomcat-9.0.79\webapps)
bin : 톰캣 실행 파일(startup, shutdown)
conf : 설정파일(server.xml. web.xml)
logs : 로그 파일(톰캣의 로그가 저장되는 공간)
webapps : 소스 파일()
war 파일 복사 후
bin 폴더에서 cmd 치고
startup 명령어 하면 서버 실행
<!-- INFO 23-11-29 10:44:21[http-nio-8080-exec-3] [BoardController:27] - 리스트 개수10 -->
<!-- %-5 : 좌측정렬(-) 5자리가 안 될 경우 공백으로 채운다. -->
<!-- %d : 로그 시간 출력 -->
<!-- %thread : 실행하는 스레드 이름 -->
<!-- %logger{0}:%line : 실행하는 클래스:라인 -->
<!-- %logger{0} == %C /%line == %L -->
<!-- %msg%n : 메시지와 줄 바꿈 -->
<!-- <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/> -->
Run As > Run Configuration
spring.profiles.active = dev
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
프로젝트 생성 시 dependency 를 추가해 준다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public PasswordEncoder getPasswordEncoder() { // 암호화를 하기 위한 빈 등록
return new BCryptPasswordEncoder();
}
// Spring security 사용에 관련된 설정
// 기능이 많이 있으므로 우리는 암호화만 사용한다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.httpBasic().disable().csrf().disable();//로그인을 비롯한 기본 기능 사용 안 함
return http.build();
}
}
@RestController
public class EncodeController {
@Autowired PasswordEncoder encoder;
Logger logger = LoggerFactory.getLogger(getClass());
String hash="";
@GetMapping(value="/encode/{msg}") // 암호화
public Map<String, String> home(@PathVariable String msg){
hash=encoder.encode(msg);
logger.info("plain : {}", msg);
logger.info("hash : {}", hash);
Map<String, String> result = new HashMap<String, String>();
result.put("plain", msg);
result.put("encoded", hash);
return result;
}
@GetMapping(value="confirm/{msg}")
public Map<String, Boolean> confirm(@PathVariable String msg){
logger.info("plain : {}", msg);
logger.info("hash : {}", hash);
// 평문 -> 암호화 -> 암호화된 문장과 기존의 암호화 문장을 비교
// spring security 암호화는 sault 라는 값을 이용해 같은 값을 넣어도 다른 형태의 암호문이 나온다.
// 암호화 된 문장끼리의 비교가 불가능하다.
// 그래서 현재 넣은 평문이 암호화된 문장과 일치하는지 알려주는 메서드를 사용해야 한다.
Map<String, Boolean> result = new HashMap<String, Boolean>();
boolean success=encoder.matches(msg, hash);
result.put("match", success);
return result;
}
}
@PostMapping(value="/join.do")
public ModelAndView join(@RequestParam Map<String, String> params) {
logger.info("params:"+params);
String encodedPw =encoder.encode(params.get("pw")); //params 의 pw를 가져와서 encoded 한다.
logger.info("암호화된 비밀번호: " + encodedPw);
params.put("pw", encodedPw);
ModelAndView mav=new ModelAndView();
String msg=service.join(params);
logger.info("msg:"+msg);
mav.setViewName("index");
mav.addObject("msg", msg);
return mav;
}
@PostMapping(value="/login.do")
public ModelAndView login(@RequestParam String id, @RequestParam String pw,HttpSession session) {
logger.info(id+"/"+pw);
ModelAndView mav=new ModelAndView();
String msg = "아이디 비밀번호를 확인해 주세요!";
if(service.login(id, pw)) {
session.setAttribute("loginId", id);
msg = "로그인에 성공했습니다.";
mav.setViewName("redirect:/list.do");
}else {
mav.setViewName("index");
mav.addObject("msg", msg);
}
return mav;
}
public boolean login(String id, String pw) {
String encodedPw =dao.login(id);
logger.info(encodedPw);
return encoder.matches(pw, encodedPw);
}