특정 이름을 지어주지 않는한 id_rsa, id_rsa.pub 이렇게 두 개가 생성될 것이다. 각각 private key, public key 이다. public key인 id_rsa.pub을 mv id_rsa.pub authorized_key 로 등록 해준다. 그리고 private key인 id_rsa를 mv id_rsa id_rsa.pem 으로 pem 키를 만들어준다. 만들어진 pem키는 접속할 때 필요한 키이다.
ssh-add {key가 존재하는 경로와 key명} 로 해당 key를 등록해준다. 그리고 ssh-add -l 으로 잘 등록 되었는지 확인이 가능하다.
ssh 로 원하는 서버에 접속한다.
삽질
1.
WARNING: UNPROTECTED PRIVATE KEY FILE! 혹시 이런 에러 뜨면 다음 명령어 입력 하면 된다.
chmod 600 {key 명}
2. ssh 로 서버에 접속할 때 비밀번호입력을 요구하면 ~/.ssh/ 에 id_rsa.pem 혹은 id_rsa.pub 키가 없다는 뜻이다.
3. enter passphrase for key”가 뜨는 이유는 키 페어를 생성할 때 Phrase를 입력해서이다. 이걸 안뜨게 하고 싶으면 해당 구문을 입력하는 단계에서 그냥 엔터를 치면 된다.
느낀점
개인 클라우드 서비스를 만들어 보려고 NAS용 컴퓨터를 구입해서 이것저것 시도중이다. 이번 서버접속하는 단계를 조작해보면서 예전에 학부때 들은 시스템클라우드보안 수업에서 들은 RSA, Diffie-hellman 등 수업 내용들이 다는 아니지만 생각나고 추억들이 떠올랐다. 기분 좋은 옛 생각이 떠오르는 시간이었다. 그리고 지금껏 AWS, NCP 등 이미 만들어진 클라우드 서비스만 사용해오다가, 이런 클라우드 서비스를 직접 만들어 보니 평소에 사용하고 있던 서비스들이 어떤 방식으로 만들어 졌을거고, 해당 서비스들을 처음 개발하고 관리하는 사람들은 어떤 고민을 하면서 만들었고 유지보수 하고 있는지 더 깊게 상상해보고 고민해보는 시간이었다.
기존에 Mybatis만 사용하고 있어서 단일로 DataSourceTransactionManager를 사용중이었는데, JPA를 도입하면서 JpaTransactionManager 를 추가 해야 했다.
기존에 DataSourceTransactionManager에 JpaTransactionManager bean을 @Primary 로 하고 테스트 코드로 Mybatis와 JPA 혼합해서 DML을 해보았다.
Mybatis로 select
JPA로 insert
JPA로 select
Mybatis로 insert
잘 되었다.
그러나 롤백에서 문제였다.
Mybatis로 select
(예외 throw)
JPA로 insert
문제
JPA로 select
(예외 throw)
Mybatis로 insert
Mybatis로 insert할 때롤백이 안되는 문제였다.
프로젝트에 기존에 있던 로직들이 다 Mybatis로 되어 있는데, 현재 상태로는 @Primary로 되어 있어 있는 JpaTransactionManager를 사용하고 있어서 기존 로직들이 롤백이 안됐다.
그래서 JPA에는 JpaTransactionManager를 사용 해야 하고, Mybatis에는 DataSourceTransactionManager를 사용 하여 트랜잭션을 관리 하게끔 해야 했다.
여러 대안이 있었다.
ChainedTransactionManager
JtaTransactionManager
@Primary를 DataSourceTransactionManager 로 변경하고 JPA 로직에만 @Transactional 에 트랜잭션 매니저 명시
ChainedTransactionManager는 후 순위로 커밋하는 트랜잭션에서는 예외가 발생하면 이전 트랜잭션에서 커밋된 부분은 롤백이 안되는 한계가 있었고, 어느 한 쪽의 커넥션 갯수가 부족해서 타임아웃이 발생할 가능성도 우려 됐다. 무엇보다 해당 트랜잭션 매니저는 단순 순차적으로 커밋하는 것일 뿐 2PC가 아니라 도입하기 걱정스러웠다.
JtaTransactionManager는 XA 프로토콜을 사용한 완벽한 2PC로 구현되어 있었다. 그러나 락이 잡히는 시간이 길어질 것 같고, 여러번 디비랑 커넥션을 맺어 퍼포먼스에 이슈가 있을 것 같았다.
그래서 @Primary를 DataSourceTransactionManager 로 변경하고 JPA 로직에만 @Transactional 에 트랜잭션 매니저 명시를 해서 처리했다.
이러한 에러를 맞이했다. Boolean 타입과 Timestamp은 비교대상이 안된다고 한다.
해결책 모색
나의 코드에서 Boolean 타입 혹은 Timestamp을 비교하고 있는 로직을 찾아보았다.
이 부분이 뭔가 잘못된 것 같다. 논리적으로 잘못된 것이 없어보이는데 아마 추측으로 '&&' 부분이 잘못된 것 같았다. 그래서 찾아보니 '&&'는 'AND'의 약어이고 같은 기능을 하지만 'AND'는 SQL 표준 연산자로 모든 데이터베이스 시스템에서 지원된다고 한다. (이식성이 좋은 것 같다.) 그래서 'AND'로 적용해보았다.
처음에 제공된 크레딧으로 많은 기능들을 사용해 볼 수 있었다. 아마 2년 전쯤 AWS로 간단하게 배포한 경험이 있었는데 그때의 기억을 되새겨 보면 AWS는 UI가 투박스럽다고 느낀 기억이 있다. 네이버 클라우드는 내가 한국인이라 네이버를 많이 애용해서 그런지 모르겠으나 친근한 UI이고 UX또한 좋아서 이것저것 설정하는데 한결 편했다.
그리고 공식문서가 너무 잘 되어 있어서 꼼꼼히 잘 읽으면서 필요한 기능들을 설정하니 모든 기능들을 잘 적용할 수 있었다. 이번에 NCP 클라우드 환경 설정을 하면서 블로그를 거의 찾아보지 않았던 것 같다.
그러나 깜짝 놀랬던점은 FileSafer라는 기능이 있는데 이 기능에서 약 하루만에 9만8천원이 나가버렸다ㅠㅠ SourceCommit에 푸시한 코드들이 바이러스가 없는지 검사해주는 기능이어서 좋아보여서 설정을 해두었는데 돈이 너무 많이나가 버렸다. 피같은 내 돈...아무리 크레딧이지만 나한테는 정말 귀했다.. 10만원, 30만원 크레딧이 있었는데 10만원 크레딧이 다 소진 되었다고 아침에 문자가 와서 어안이 벙벙하여 NCP 크레딧 현황을 봤는데 너무 허무했다. 그치만 9만8천원에 인생공부 했다고 생각했다. 개발도 인생에 포함이 되니 인생 공부라고 하겠다.
MySQL 서버를 띄었는데 돈이 너무너무 많이 나갔다. 하루에 거의 2만원쯤 나갔나..? 기억이 안난다. 그래서 바로 디비 인스턴스를 내린 기억이 있다. 지금도 핀포인트랑 디비 성능 테스트할 때만 디비 인스턴스 올려서 테스트 하고있다.
프로젝트를 진행하며 재밌었던 점
이번 SKKA 프로젝트를 하며 다양하게 로직을 구현 해보기도 하고, Restful 하게 API도 만들어보고 객체지향을 빡세게 적용 시켜보기도 하고 클라우드 환경 구성과 CI/CD 적용을 하는 등 정말 다양하게 많이 해보았다. 특히 재미있었던 부분이 객체지향적인 설계였다. 코딩을 하면서 "집청소"하는 느낌이 든 적은 이번이 처음이었다. 난잡하고 가독성이 떨어지면서 객체들의 역할을 생각하며 코딩을 했다. 처음에 Service 코드에 로직을 구성하고 리팩토링 작업을 시작하면서 각각의 도메인 객체가 맡은 역할을 생각하여 비즈니스 로직으로 집어 넣는 작업들이 재미있었다. 마치 어릴 때 좋아했고 지금도 좋아하지만 하지 못하고 직업을 갖고 하려고 하는 레고조립 같았다.
프로젝트를 진행하며 어려웠던 점
스터디카페 예약 시스템을 구축하는 단계에서 검증 해야 하는 케이스가 생각 할수록 계속 나왔다. 그래서 총 9가지가 나왔었다. 이것을 검증하려고 몇일을 고민했던 것 같다.
프로젝트를 하면서 데이터베이스 id, password, secretKey 등은 깃헙 레포지토리에 노출되면 공격자가 쉽게 서버의 중요한 정보를 알아내어 서버가 위험해 빠질 수 있다. 이것을 방지하기 위해 env.properties 파일을 만들어서 중요 정보들을 관리를 했는데 프로젝트의 비즈니스 로직과 관계없는 클래스를 생성하여 환경설정을 해줘야했다. 그래서 개선을 해보았다.
문제 해결
문제를 해결하기 위해 OS자체내에 환경변수를 설정했다.
터미널이 실행되면 .bash_profile 파일 부터 읽는다고 한다.
1. vi ~/.bash_profile
위 명령어를 터미널에서 입력하여 export PORT=8080 이런식으로 원하는 변수들을 설정해준다.
설정이 완료 됐으면 wq로 저장 하고 나간다.
2. source ~/.bash_profile
위 명령어로 수정된 값들을 바로 적용 시켜보자
3. 테스트 하기
echo $변수 를 사용하여 잘 나오는지 테스트 해주자.
아래와 같이 나온다면 정상적으로 적용 되었다는 뜻이다.
4. 코드에 적용하기
테스트 까지 완료 후 코드에 적용해보자.
나는 IntelliJ IDE로 스프링부트 프로젝트를 하고 있는데, application.yml 설정 파일에