BE : Spring + FE : React 프로젝트를 작은 규모의 cloud server(aws : t2.micro, ncloud : Standard)에 배포하며 마주한 이슈1. 마주했던 고민외주 프로젝트에서 Backend는 Spring 프레임 워크로 Frontend는 React라이브러리를 활용해 mvp 모델을 개발하던 중, 우선 가장 작은 규모의 cloud server(aws기준 t2.micro - RAM 1GiB)에 배포하면서 어떤 구조로 서버를 배포해야 할지 고민하게 되었다. FE, BE 서버를 각각 run 시킬 것인지, 아니면 하나의 서버에서 각각 다른 포트에 FE, BE server를 구동할 것인지.. 혹은 mvc패턴으로 react 앱을 빌드한 뒤 spring 서버에서 정적 리소스로 제공할 것..
1. 안녕하세요? AWS에 벽돌 12,000장쯤 사준 YanaKo94입니다. RDB 인스턴스를 줄여야할 필요성의 대두..(feat 비용절감... 어디부터 해볼까..!) 그렇다, 프로젝트를 AWS RDS와 EC2를 통해 배포한 지 어언 1년가량이 흘렀고... 나의 AWS 관련 비용 지출은 이제는 조금 자신 있게 "아마존에 벽돌 낭낭히 사줬습니다"라고 할 수 있을 정도가 되어버렸다. 프로젝트를 내리고 싶지 않았기에 결국 비용 절감을 위해 기존 배포방식을 변동하기로 결심했고, EC2의 경우 인스턴스를 합치기 전에 CD를 구축하면서 업로드받는 resorce를 인스턴스 내부에 저장하는 방식에서 S3 storage로 변경하는 것이 필요하다고 판단해 우선 RDB부터 정리를 시작했다. 2. mysqldump, 뭐하는 ..
AWS… 월 청구 비용 25만원. 이게 정말 맞나요?(클라우드에 대한 이해 없이 진행한 배포의 비싼 수업료) EC2 인스턴스 2개에서 spring - jsp 프로젝트와 node-react 프로젝트를 돌리던 어느날, 어마무시한 청구서가 날아왔다. 팀프로젝트를 진행하며 동일한 DB를 사용하기위해 공유했던 각 프로젝트들의 RDS 인스턴스와 더불어서, node-react에 대한 이해 없이 백엔드와 프론트엔드 각각의 js 런타임을 서버에서 돌리기 위해 규모가 큰 EC2인스턴스를 사용한 결과였다. AWS 클라우드와, Node 그리고 JS의 런타임에 대한 이해의 부족이 만들어낸 눈덩이같은 결과였다. 이에, 우선 사용중인 AWS 서비스들이 정말 필요한지 판단을 하기 시작했는ㄷ, 포트폴리오를 위한 서비스들이었고, 유..
프로젝트를 진행하며 Member에 대한 CRUD를 구현하던 중, 가장 고민이 됐던 부분은 Update라고 말할 수 있다. 1. Setter방식, 과연 이대로 괜찮은가? 처음에는 아래와 같이 Member Entity의 @Setter를 열어둔 뒤, update시에 Dto를 통해 받아온 값들을 Entity에 각각 SetXXX해주는 방식을 사용했었다. @Transactional public Member updateMember(Member member) { Member existingMember = getMemberByEmail(member.getEmail()); existingMember.setEmail(member.getEmail()); existingMember.setPassword(member.getPas..
0. 상황 - rosetta 전용 iterm shell 을 생성하고, 관련 alias를 생성하던 중.. 잘못된 명령어를 입력해 .zsh 파일이.. 덮어씌워졌다.1. 울지 말고 말해봐 좌절하던 내게 코코가 보내온 한마디....... 그래...! 나는...! 내게 카오스 엔지니어링을 하는 중인거야!2. 원인 - 원인은.. alias를 생성하다가.. 정말..무심결에...입력한.. 단...한줄의... 스크립트에서 시작된다..!! 주의 !! 아래 스크립트는 절대 따라 입력하지 마시오..!!alias rpyenv="arch -x86_64 /usr/local/bin/pyenv" -> .zshrc 그렇다.. >>를.... 정신을 놓은채로 ->로 입력하고 말았다...원래 입력했어야할 스크립트는.. 아래..
1. @Embedded , @Embeddable : JPA_ Entity의 가독성 높이기 1.1 Member Entity의 기존 구성요소 public class Member extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String email; @Column(length = 20) private String nickname; private String password; private String realName; @Column(nullable = false, unique = true) private ..
1. 학습 계기 기존에 개발해 둔 팀프로젝트들을 배포해서 포트폴리오로 사용하고자 하였다. 직접 AWS server에 올려보니 local환경이 아니기 때문에 발생하는 이슈들이 있었으며, 팀프로젝트 배포당시 발견되지 못했던 이슈들이 있어 수정작업을 하다 보니 매번 수정 후 server에 올려 확인하는 작업이 매우 불편하게 느껴졌다.(기존에는 git repo를 server에 직접 pull 받아 이미지를 build 하는 방법을 사용하다가 용량이 적은 프리티어 서버에서 직접 build를 하는 것에 부담을 느껴 -> build한 파일을 별도의 github repo에 업로드해서 서버에서 pull 받아 사용하던 방법을 사용하고 있었다. 프록시의 경우에는 처음에는 포트포워딩을 설정해 두었다가, nginx를 통해 리버스프..
사실 전부터 'System.out.print()를 사용하면 성능에 좋지 않고 logger가 조금 더 프로젝트 내부에서 출력을 하는 목적에 맞으니 logger를 사용해보세요’라는 피드백을 받고 "System.out의 사용을 지양해야겠구나"라고는 생각하였으나 제대로 파헤쳐 보지 못했는데, 오늘 JAVA교육 수강 중 System.out이 나와 이참에 “대체 왜 System.out은 운영 및 개발환경에서 사용을 지양해야하는지” 알아보고자 한다. +[게시글 작성 마무리 작업 중 추가하는 한 마디] 한번 제대로 파헤쳐보니, 왜 System.out의 사용을 지양해야하는지 이해가 가기 시작했다. 습관적으로, 그리고 logging 프레임워크를 불러와 사용하기 귀찮다는 이유로, 디버깅 상황에서 Sout을 호출하던 습관을 ..
[작성중]0. 상황 - 새로 참여하게 된 프로젝트가 arm을 지원하지 않는 python 버전(3.7.9)을 사용하고 있었다. - 하지만 나의 노트북은 M1(arm)... 어쩌지! ( 관련된 나의 python 관련 삽질 일기는 여기! 에서 볼 수 있다 ...;- - 팀 리드분이 "rosetta" 를 이용해 intel 기반으로 환경 설정을 맞출것을 요청하셔서, iterm을 복제해 rosetta 전용 터미널로 적용하고 brew나 pyenv처럼 자주 사용할 명령어에 대해서는 alias를 적용해 사용하기러 결정했다. + 각 아키텍쳐별 터미널을 켤때 해당 아키텍쳐별 PATH로 알아서 변경해준다면..?1. rosetta가 적용된 iterm2를 만든다!1. finder 에서..
백엔드 개발자로 취업을 준비하며, 국비교육 이후 몇 개의 프로젝트들을 진행해 왔지만 "매력 있는 신입 개발자"가 되기에는 모자람을 느꼈다. 이에 백엔드 개발자 커뮤니티와 각종 커피챗에 참여해 현직 미들, 시니어급 개발자분과 이야기를 나눈 후 Spring Framework의 Security와 Oauth2, JPA, Batch 등 실무에서 기본적으로 다룰 기능들이 포함되며 Testcode와 api 명세 자동화에 대한 나만의 고민이 담긴 프로젝트를 취업 준비와 병행하기로 결정해서 진행 중이다. 이미 시작한 지는 조금 되었지만 기존 프로젝트들과 다르게 하나하나 많은 고민들이 담긴 프로젝트이기에 작은 고민까지 하나하나 기록에 남기고 싶어 블로그 연재를 시작한다. 우선, 아키텍처는 멀티모듈 아키텍처를 선정해서 진행..
obsidian에서 작성중 MultipartResolver를 bean으로 설정해주어야 하는가? No spring 어플리케이션의 경우 web.xml에서 MultipartResolver를 bean으로 직접 등록해주어야 하지만, spring boot 어플리케이션은 default로 제공한다. HTTP 표준과 content type HTTP 표준은 1개의 요청에는 하나의 content type만 전송하는것을 약속함. (여러개의 content 타입을 전송하는것이 불가능한것은 아님.) multipart formdata가 여러 content-type를 보낼수 있도록 만들어진 것 아닌가? multipart formdata란? 디버깅으로 밝혀진 @ReuestParam의 반란 이미지 등의 file 업로드를 별도의 api로 ..