아파치나 NginX 같은 웹서버 없이 Spring Boot으로 만든 웹 어플리케이션에 무료 SSL 중 하나인 Let's Encrypt을 적용하게 되었다.
90일동안 사용가능하며 다시 갱신을 시켜줘야하나? 싶었지만 간단한 설정으로 자동갱신까지 가능하니 참 괜찮은 것 같다.
그리고 Let's Encrypt SSL 인증서 발급 방법은 여러가지가 있는데 그 중 standalone 방식을 택했다.
1) standalone . 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식 . 80포트로 가상 standalone 웹서버를 띄워 인증서를 발급 . 이 방식은 동시에 여러 도메인을 발급 받을 수 있음 . 자동갱신 가능
2) webroot .사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급 . 실제 작동하고 있는 웹서버의 특정 데렉토리의 특정 파일 쓰기 작업을 통해서 인증 . 이 방식의 장점은 서버를 중단없이 발급 가능 . 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능 . 자동갱신 가능
3) DNS . 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법 . 와일드 카드 방식으로 인증서를 발급 가능 . 이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 하며 . 인증서 갱신 시마다 DNS에서 TXT값을 변경해야
이제부터 standalone 방식으로 인증서를 발급받아 SSL을 적용해보자.
(적용하기 위해 이미 웹 어플리케이션은 배포된 상태여야 하며, 도메인 주소를 가지고 있어야 한다. )
STEP1. 터미널로 리눅스 서버에 원격 접속한다.
STEP2. Certbot을 설치한다.
sudo apt-get install certbot
STEP3. 기존에 사용중인 80 포트는 kill 한다.
STEP4. Certbot을 어떤 방식으로 구동시킬 지 선택한다. (난 standalone 방식을 택했다.)
sudo certbot certainly --standalone
위 그림처럼 입력하면 이메일을 입력하라고 나타나고 이메일을 입력하면 된다.
곧이어 동의 절차글이 나타난다. A, Y를 차례대로 입력하고 마지막으로 ssl 인증설르 발급받을 도메인을 입력한다.
위처럼 Congratulations!! 문구가 뜨면 성동! 그리고 /etc/letsencrypt/live/도메인/ 경로에 fullcahin.pem과 privkey.pem 가 발급되었다고 안내한다. 위에서 알려주는 경로로 이동하자. (live 폴더 이상 안들어가진다면 접근권한이 없는 것이므로 sudo -i로 접근하거나 root로 들어가면 live폴더 이상 접근 가능하다.)
STEP5. pem은 스프링 부트에서 인식을 못하므로, pem을 PKCS12 형식으로 변경
-fullchain.pem, privkey.pem 등이 발급받아진 경로로 이동 한 뒤 아래 명령어를 입력하면 keystore.p12 파일이 생성된다.
# Crontab 보기
$ crontab -l
# Crontab 편집
$ crontab -e
crontab -e 로 편집 모드로 들어갑니다.
그 다음 매달 1일에 자동 갱신 될 수 있는 아래 명령어를 입력하고 저장 후 나오면 끝!
$ 0 2 1 * * /usr/bin/certbot renew
인증서 만료일 확인하기
Certbot으로 부터 발급받은 인증서들에 대한 정보를 표시합니다.
$ certbot certificates
인증서 갱신 모의 테스트
인증서 renew 갱신이 제대로 동작하는지 테스트 해볼 수 있습니다.
certbot renew --dry-run
만약 certbot renew 도중 아래와 같은 에러가 발생한다면?
Attempting to renew cert (www.도메인.kr) from /etc/letsencrypt/renewal/www.도메인.kr.conf produced an unexpected error: Problem bindging to port 80: Could not bind to IPv4 or IPv6......
apache2를 중단 하고 다시 실행해보자.
systemctl stop apache2.service
그리고 다시 certbot renew 로 실행하면 Congratulations, all renewals succeeded ..... 등의 내용이 뜸!!!
Mybatis에서 파라미터를 DTO 혹은 Map 형식으로 받는 방법과 Map<String, Object> 형식으로 받는 방법을 알아보자.
1. 파라미터를 DTO 형식으로 받기
// DTO 클래스
@Data
public class MetaMngRequestDTO {
private Map<String, Object> data;
private String id;
}
// Service
public void updateMetaData(MetaMngRequestDTO dto) {
testDAO.updateTest(dto);
}
// DAO Interface
void updateTest(MetaMngRequestDTO dto);
// Mapper XML
<update id="updateTest" parameterType="com.test.MetaMngRequestDTO">
update TEST_TABLE
set
ITM_SEQ = #{data.ITM_SEQ},
TEXT = #{data.TEXT}
where SID = #{id}
</update>
쿼리쪽에 parameterType="넘겨주는 DTO 경로 및 이름"를 추가해야하며, DTO의 필드 중 String 타입 같은 경우는 #{id}로 곧장 쓸 수 있지만 Map형식일 경우는 #{필드명.key이름}으로 써준다 (ex. #{data.TEXT} )
(parameterType을 생략할 수 있으며, 그럴 경우 바로 dto의 필드명을 쿼리에 #{id} 이런식으로 곧장 사용 가능.
2. 파라미터를 Map형식으로 받기
// Service 클래스
public void insertTest(Map<String, Object> columns) {
testDAO.insertItemYnSync(columns);
}
// DAO Interface
void insertTest(Map<String, Object> dataValues);
// Mapper XML
<insert id="insertTest" parameterType="hashmap">
insert into LT_REG_META_ITM_YN
(ITM_SEQ, WRITER, CONTENTS)
values
(#{ITM_SEQ}, #{WRITER}, #{CONTENTS})
</insert>
이번에는 parameterType=“hashmap”을 추가!
그리고 #{맵의 키}를 써주면 해당 키에 맞는 데이터가 들어간다.
예를 들면
map에서 (“WRITER”, ”홍길동”) 이렇게 key-value가 있다고 치자. 그리곤쿼리쪽에서 #{WRITER}로작성하면, 쿼리는실제 ‘홍길동’으로들어가서실행된다.