서버를 구성할 때 고를 수 있는 언어는 다양한데 각자 장단점이 있는 것 같다. java의 spring framework를 잘 쓰시는 분들이 워낙 많아서 특이사항이 없으면 spring을 고르는게 좋은 것 같지만 그래도 다른 언어의 프레임워크를 쓰면 좋을 만한 상황이 있는 것 같다. 그 중에 파이썬으로 구성하면 두 가지 상황에서 강점을 발휘한다.

python

1. 머신러닝, 데이터 사이언티스트와 같이 협업하기 좋다.
  머신러닝 개발자나 데이터 사이언티스트라면 파이썬에 익숙할 것이다. 그러면 머신러닝 개발자가 모델을 서빙하는 서버를 구축해야한다던가, 데이터 사이언티스트가 데이터 파이프라인을 만드는데 있어서 서버도 같이 본다던가, 그런 유도리있는(?) 개발이 가능하다. 협업이라고 하기엔 조금 이상한 것 같은데 아무튼 유연한 상황들이 있어서 좋은 것 같다. 그래서 머신러닝에만 집중하는 회사들은 파이썬으로 서버를 만드는 경우가 많은 것 같다.

2. 스크립트 언어답게 일회성으로 뭔가 만들어야 할 때 좋다.
  가끔은 일회성으로 해야 할 것들을 코드로 짜는 경우도 있는데 이럴 때 참 편한 것 같다. 컴파일도 프로젝트 생성도 필요없이 스크립트 짜서 뭔가 하게 하는 것도 좋은데 django 같은 경우에는 python manage.py shell < main.py 과 같이 django 내부에 정의되어 있는 모델, 함수들을 바로 쓸 수 있어서 편하더라. 컴파일 언어 같은 경우에는 batch나 내부에 따로 일회성 api를 짜야할 것 같은데 더 좋은 방법이 있는지는 잘 모르겠다.

그리고 뭐 바로바로 실행하면서 함수를 테스트할 수 있는 것도 좋은 점이긴 한데 그건 스크립트 언어들의 장점이니까 '파이썬'으로 서버를 구성했을 때의 장점은 아니다. 아무튼 쓰면 쓸 수록 귀여운 언어인 것 같다. 뭔가 개구쟁이 같은 느낌이다.

openjdk

java로 사이드 프로젝트를 진행해보면서 로컬환경과 ec2에 java를 깔면서 openjdk를 제공하는 여러 벤더사꺼 중에 뭘 선택해야하는지 궁금하기도 했고, 차이가 있나 궁금해서 조금 리서치를 해보았다. 그 와중에 https://whichjdk.com/ 라는 사이트를 발견하게 되었고, 간단하게 설명되어 있어 좋았다.

 

Which Version of JDK Should I Use?

Which Version of JDK Should I Use?

whichjdk.com

 

위 사이트에 따르면 tl;dr(Too long, didn't read)라는 요약으로 이클립사 foundation에서 제공하는 Termurin을 쓰는 것이 권장된다고 써있다. 왜냐하면 high-quality, vendor-neutral, TCK-tested under permissive license 이기 때문이라고 설명되어 있다. 찾아보면 생각보다 많은 벤더사들이 제공하고 있는데 자신에게 맞는 것을 고르거나 위에서 말한 termurin을 쓰는 것이 맞는 것 같다. (저자는 aws ec2에 서버를 올리는게 보편적이고, 혹시 미래에 'amazon linux2 같은 곳에 default로 그냥 openjdk가 아닌 corretto가 깔려있을 수도 있지 않나?' 라는 생각에 corretto 11을 쓰고 있다.) 참고로 github actions에서 java를 setup 때 제공되는 openjdk는 아래와 같고, 모든 openjdk를 제공하지는 않는 모습이다.

https://github.com/actions/setup-java

 

라인사의 기술블로그에 openjdk를 적용하는데 있어서 redhat이 배포하는 openjdk를 선택한 이유와 여러가지 좋은 내용을 써놓은 글이 있어서 참고하면 좋을 것 같다. 

 

LINE의 OpenJDK 적용기: 호환성 확인부터 주의 사항까지

2022-LINE-engineering-site

engineering.linecorp.com

 

예전에 s3에 이미지를 올려놓고, 퍼블릭에서 엑세스 가능하도록 개발을 하는 경우가 많았는데 그럴 때마다 모든 퍼블릭 엑세스 차단을 풀고, ACL(엑세스 제어 목록)에 모든 유저를 열어서 개발한 적이 있었는데 생각해보면 보안상 문제가 있을 것 같으므로 이번에 사이드 프로젝트를 하면서 어떻게 하면 퍼블릭 유저가 할 수 있는 걸 최소화할 수 있을까 고민해 봤다.

일단 ACL에서는 모든 유저에게 어떤 권한도 주지 않았다. 버킷에 유저가 접근 가능해야하는 파일과 접근 불가능해야하는 파일이 같이 있을 수도 있기 때문에 그렇게 하였고, 오직 버킷 소유자만 객체, 객체 ACL에 읽기,쓰기가 가능하도록 해놓았다. 그리고 퍼블릭 액세스를 가능하게 해야하는 파일들은 파일을 업로드 하는 어플리케이션 서버에서 지정하도록 해놓았다. (Spring 서버에서 putObject할 때 PublicRead로 객체 읽기를 열어두도록 지정해줄 수 있다.)

새 ACL, 임의의 ACL을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단은 풀어놔야 publicRead로 객체를 만들 수 있었다. 액세스 지점 정책은 따로 endpoint를 두어서 S3에 대한 접근을 관리할 수 있는 기능 같은데 사용하고 있지는 않기 때문에 그냥 차단해 놓았다.

영어를 번역해 놓아서 그런지 ACL(엑세스 제어 목록), 객체, 객체 ACL 등등 말이 되게 어렵게 되어있는 것 같다.


참고글
S3 개념 및 용어 관련 정리
https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95#ACL_(Access_Control_List)

spring에서 s3에 이미지 업로드
https://www.sunny-son.space/spring/Springboot%EB%A1%9C%20S3%20%ED%8C%8C%EC%9D%BC%20%EC%97%85%EB%A1%9C%EB%93%9C/

 

이전까지는 사이드 프로젝트나 토이 프로젝트를 할 때 혼자 했었다. 근데 이제는 프론트엔드 개발자와 디자이너, 기획자 분들과 함께 하다보니 프로젝트가 온전히 나의 것이 아닌 상황이 되었고, 이 프로젝트를 위한 aws 계정을 파는 것까지는 아니더라도, 회사에서 쓰는 것처럼 내 계정을 root 계정으로 돌리고, 다른 분들께 aws console에 접속할 수 있는 권한과 관리자 권한을 드려야 한다는 생각이 들었다. 나도 이제 시작이지만 처음 이런 상황에 마주하게 되어서 조그마한 프로젝트지만 혼자하는 프로젝트가 아닌 분들께 도움이 되지 않을까 하는 생각에 기록해본다.

1. aws organization을 사용할 상황은 아니다.
 처음에는 막막해서 그냥 회사 dev aws에 내 계정은 어떻게 설정되어 있는지를 보았다. 들어가기 전에는 organziation을 만들어야 하는건가 싶었는데 그건 조직이 커졌을 때 devops 조직과, 그냥 개발팀을 나눈다던지, 결제 관련해서 나누어야 하는 상황일 때 쓰는 것이였다. 그래서 이건 pass.

2. 일단 토이프로젝트라서 아무 것도 만들어져있지 않은 상황이기 때문에 어느정도 개발된 후에 aws를 만들어도 된다.
 백도 프론트도 이제 처음 시작이기 때문에 github로 코드를 공유하면서 local에서 개발한 후, 어느정도 기반이 되었을 때에나 aws에 서버를 만들어도 늦지 않을 것 같다.

3. iam을 통해 관리자 group을 만들고, 자신을 user에 추가하고, 동료분들도 user에 추가한다.
 내 계정엔 admin이라는 user group을 만들고, user에 자신의 계정도 새로 만들어서 개발할 때 iam 계정을 통해 사용하도록 한다.( root 계정은 특별한 경우가 아니면 쓰지 않도록 아마존에서도 권장하는듯) 동료 분의 계정을 추가하기 위해 add user을 통해 user이름을 적고 아무 비밀번호를 적거나 auto generated password로 한 후에 required password reset을 체크한다. 다른 방법으로는 access key를 이건 sdk, api를 통해 aws를 사용하는 user를 위한 설정인듯 하니 pass. 
(auto generated password로 설정하면 계정을 만든 후에 welcome email(?)을 보내도록 하는 페이지가 뜰 때 거기에 auto generated password가 있다.)
 
 iam으로 접속할 때 12자리 계정 id가 아닌 별칭을 쓰고 싶다면 iam dashboard에서 오른쪽 사이드바(?)에 별칭 설정이 있다. 그걸 바꿔주면 된다.

이제 막 배우는 단계다 보니 새롭게 느끼는 점이 많아서 기록해 놓고 싶어서 써본다. 

1. 컴파일러 때문에 실수가 많이 준다.
  이건 django -> spring이 아니라 python -> java에 해당하는 점. python을 쓰다보면 오타를 냈다던가, 1 * 5을 생각하고, 코드를 짰는데 테스트하다보면 '1'이 들어와서 '11111'이 반환되는 경우들이 생긴다. 근데 java를 쓰다보면 오타라던지 동적 타입 때문에 생기는 실수들이 매우 많이 준다.

2. spring을 사용해보면 제공되는 무언가가 굉장히 많다...
 이거는 장점이 될 수도, 단점이 될 수도 있는 것 같다. django를 가지고 개발할 때는 환경세팅할 때 고려해야할 것이 많지는 않았던 것 같다. 근데 spring을 가지고 개발할 때는 이 spring만을 위해서 제공되는 무언가들이 굉장히 많은 것 같다. spring이 발전해서 spring-boot가 생겨났다던지, spring-boot-initiatior라는 페이지가 있다던지, test 툴들도 선택지도 많고, java를 간편하게 개발하도록 lombok이 있다던지...
 근데 선택지가 많아서 뭐를 선택해야 하는지 구글링이나 고민도 해야하고, 빌드 툴도 gradle, maven이 있고, 더 나아가서 버전에 따라 문법도 달라지더라. 아무튼 spring, java의 생태계는 엄청 넓은 것 같다...

사족으로 오랫동안 django, python을 사용하다가 spring, java를 사용해보니 장점이 많이 보이는 것 같기도 하다. 근데 항상 새롭게 배우면 장점이 많이 보이고, 오랫동안 사용하면 할수록 단점들이 보이는 것 같다. 이런 걸 많이 경험해보면 어떤 상황에 어떤 걸 선택해야하는지 안목도 생기지 않을까 하는 생각이 든다 :) 

+ Recent posts