[IT국비지원] 개발자 교육 : Spring Boot(2023.11.29) Scheduler, Tomcat, 가짜톰캣, Build, 암호화

Nicole Gold·2023년 11월 29일
0

K-digital training

목록 보기
58/60

드디어 배우는 스케줄러! 세미프로젝트 때 구독 시스템 만드려고 필요했는데 이후에 배울 테니 사용하지 말라고 해서 기다렸었다. 다음 프로젝트에서 사용해야지🎶

라고 생각했는데 정말 별거 없이 넘어갔다... 부트에서는 간단하게 사용 가능한데, spring에서 하려면 어떻게 하는지는 따로 알아봐야 할 것 같다😐

Spring Boot Scheduler

  • Spring Boot Scheduler 는 별도의 라이브러리나 설정 없이 사용 가능하다.
  • 사용할 클래스에 EnabledScheduling 을 추가하고,
  • 사용할 메서드에 @Scheduled 메서드를 사용하여 동작할 수 있도록 한다.

Tomcat

  • 지금까지 사용하는 Tomcat 은 Spring Boot 안에서 제공되는 내장 Tomcat 이다.
  • 이전에 설치했던 Tomcat 을 사용할 수도 있다.
  • 이 둘은 물론 각각의 장점이 있다.

FileService 를 외부 Tomcat 을 이용하여 구현해 보기

  • 포트 넘버 변경 가능
  • path 변경 가능
  • server.xml 에서도 변경할 수 있다.

Build 란?

  • Build 란 개발한 소스가 실행 가능한 프로그램으로 변환하는 작업이다.
  • Eclipse 에서는 plugin 을 통해 복사된 Tomcat 에 소스를 동작시켜 준다.
  • 그렇기 때문에 실제 빌드가 되었다고 보기 어렵다.

가짜 톰캣 위치 : C:\STUDY\15_BOOT.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
진짜 톰캣 위치 : 톰캣 설치한 위치 (C:\apache-tomcat-9.0.79\webapps)

  • 실제 동작할 수 있는 WAR 파일을 만든 뒤 실제 Tomcat 에 적용
  • TotalBoard 를 war 로 Build 한 다음 Tomcat 에 동작
  • Build 시 로그를 파일로 남길 수 있도록 log 설정하기

Build 전 확인 사항

  • Build 시에 뜻밖의 에러로 인해 빌드가 되지 않는 경우가 있다.
  • 그래서 미리 아래 조치가 필요하다.
  • Window > Preferences 선택.
  • java > Installed JREs.
  • JRE 로 되어 있다면 JDK 를 추가해 줄 것.
  • 기존 JRE 는 삭제해도 된다.
  • Build 전 Test 진행 문제 발생 시에도 무시하도록 아래 내용을 pom.xml 에 넣는다.

톰캣 주요 폴더

  • bin : 톰캣 실행 파일(startup, shutdown)

  • conf : 설정파일(server.xml. web.xml)

  • logs : 로그 파일(톰캣의 로그가 저장되는 공간)

    • localhost_access_log : 누가 어떤 요청을 했는지 기록
    • catalina : 주요 시스템 로그
    • localhost : System.out 같은 사용자 로그(나중에 로그백 설정으로 사용자 로그는 따로 보관할 예정)
  • 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"/> -->

WAR & JAR

WAR(Web Archive)

  • 프로젝트가 Tomcat 안에서 동작 된다
  • 가장 일반적인 형태의 빌드
  • 외부의 Tomcat webapp 폴더에 파일을 넣어야 한다
  • 프로젝트 생성시 packaging 을 war 로 선택해야 한다.

JAR(Java Archive)

  • 프로젝트가 하나의 자바 프로그램으로 동작된다.
  • 솔루션 형태가 아닌 일반 서비스에서는 사용하지 않는 편이 좋다 수용 한계가 적음.
  • Tomcat 이 내장되어 있기 때문에 Tomcat 에 파일을 넣을 필요가 없다.
  • 보통 jar 빌드의 경우 view page 가 없는 것이 좋다.
  • 프로젝트 생성 시 packaging 을 jar 로 선택해야 한다.

Profile

  • Window 에서 개발 하고 Linux 에서 배포할 경우 파일 시스템 등을 신경 써야 한다
  • 개발 시 사용하는 DB 와 실제 서비스에서 사용하는 DB 가 다를 수 있다
  • 개발 시 사용하는 포트와 서비스에서 사용하는 포트도 다를 수 있다
  • 이러한 내용들을 경우에 맞게 활용하기 위해 우리는 profile 이라는 것을 만든다
  • 우선 사용할 프로필의 properties 파일을 준비 해야 한다

  • 실행 시 : profile 을 지정할 수 있다.
    Run As > Run Configuration
  • 배포 시 : 배포할 tomcat 의 conf catalina.properties 에서 다음 항목을 추가하면 된다.
    spring.profiles.active = dev

  • 가장 하단에 추가

암호화

Spring security 암호화

  • Spring Security 는 입력 값을 SHA 256 알고리즘을 사용하는 해시 함수를 이용하여 암호화 시켜 준다.
  • input 값을 넣으면 어떤 계산에 의해 output 을 반환하는 것이 해시 함수 (Hash Function) 이다.
  • 이때 output 은 해시(Hash) 이라고 한다.
  • Hash 는 output 을 통해서 input 을 추론할 수 없다. 이것을 우리는 "비가역적"이라고 한다.

		<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();
	}
}

  • PasswordEncoder 를 autowired 로 활용해 준다.
@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;
	}
}

quest[회원 가입과 로그인 구현]

  • 회원 가입 시 password 를 암호화 하는 기능을 구현해 보기
  • 로그인 시 패스워드를 암호화 된 password 와 비교하여 Login 을 처리하는 기능
  • Member Table 의 pw 필드는 최소 100byte 가 확보되어 있어야 한다.
@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);
	}
profile
JAVA 개발자로 가는 길

0개의 댓글

관련 채용 정보