전체 글

전체 글

    늦은 2023부터 2024 2월까지 회고

    작년 12월 1/3지점이 끝난 시점 짧았던 데브코스 과정이 종료가 되었다. 작년 2월 학교 졸업을 했을 때와는 또 다른 기분이었다. 그 당시에는 취업을 할 수 있을까에 대한 막연한 두려음이 왔다면 이번에는 다양한 사람들과 함께 공부를 하고 토론을 진행하면서 혼자하는 것과는 달랐고 밤을 새워가면서까지 개발을 진행할 정도로 즐거웠기 때문에 할 수 있다라는 자신감을 가지고 있었기 때문이었다. 무언가가 끝났다는 생각을 가지고 있어서일까 12월중에 보름은 아무런 생각 없이 쉬고 놀았다. 신입 개발자에 대한 채용의 기회도 많지 않았었기도 했고 그동안 고생했던 나에 대한 보상을 주자라는 생각이었을까 얼마 진행하지 않았던 6개월이 재밌었지만 힘들었다고 생각을 가지고 있었나보다. 그래도 어느정도 정신을 차리고 12월 말..

    스프링 부트 한무 403 Error

    스프링 부트 한무 403 Error

    배경 백엔드 프론트엔드 각자 열심히 개발을 진행하면서 드디어 프론트쪽 UI작업이 어느정도 끝나고 API 연동 시점에서 계속해서 403 에러가 터지기 시작했다.. 분명 로컬에서 잘 작동을 했고 이미 모든 권한에 관련된 것들은 처리를 해둔 상태인데 도데체 왜??? 문제 에러가 발생한 이유는 되게 간단했다 develop 환경에서 JPA.ddl-auto 설정 값을 none으로 설정을 해뒀더니 개발을 진행하면서 변경된 엔티티 반영이 되지 않아서 SQLSyntaxErrorException 이 발생하게 되었다 그럼 여기서 이해가 되지 않는 점은 예외가 발생하면 아래와 같이 500에러가 터지기를 기대했는데 왠걸? 403????!? 무한 403에러가 나는 것은 바로 시큐리티에서 찾을 수 있었다 AuthorizationF..

    RequestBody Runtime시 동적 주입

    RequestBody Runtime시 동적 주입

    배경 여러개로 나뉘어있던 이력서 내부 값들을 저장하는 테이블들을 하나로 합치면서 Service, Repository가 하나로 합쳐지게 되었다 테이블 구조 변경 관련 이로인해 API들도 Request를 제외한 모든게 동일하게 되었다 (기존에는 구조는 같았지만 접근해야 할 Service, Repository도 모두 달랐다) 변경 후 Controller @PostMapping("/{resumeId}/activities") public IdResponse createActivity( @PathVariable Long resumeId, @RequestBody ActivityRequestDto request ) { return new IdResponse(componentService.create(request.to..

    Controller에서 Security 정보 가져오기

    사용자가 크게 멘토와 멘티 두개의 역할 군으로 나뉘어져 있고 두 역할이 하나의 API Endpoint를 공유해서 사용을 하고 있고 하나의 값에 대해서 접근 권한이 다르기 때문에 분기 처리가 필요로 하고 사전에 filter에서 처리된 Role을 가져오고자 한다 Annotation Role을 가져오기 위해서는 SecurityContext에 접근을 해야 하는데 Security에서 제공하는 것으로는 @AuthenticationPrincipal, @CurrentSecurityContext가 있다 @AuthenticationPrincipal SecurityContext에 담겨진 Authentication에서 getPrincipal()을 통해 principal 객체를 반환 @CurrentSecurityContext추..

    ??? : 어딜 보시는 거죠 그건 제 잔상입니다만?!?

    ??? : 어딜 보시는 거죠 그건 제 잔상입니다만?!?

    배경 진행 중인 프로젝트에서 API 문서화를 위해 Spring Rest Docs를 사용하고 있다 API 문서를 만드는 과정에서 생긴 html 파일을 함께 서버에 배포를 해서 사용을 하고 있고 https://{백엔드 도메인 주소}/docs/index.html 로 접속을 하면 문서가 나오도록 설정을 해두었고 이를 위해 build.gradle에 copyDocument 라는 Task를 만들어 두었다 tasks.register('copyDocument', Copy) { dependsOn asciidoctor doFirst { delete file('src/main/resources/static/docs') } from file("build/docs/asciidoc") into file("src/main/resou..

    Redis 사용기

    Redis 사용기

    배경 회원가입 시 카카오 인증만 진행하고 필수 정보를 작성하지 않은 사용자는 사용자가 맞을까?? 일단 내 기준에서는 아니다 필수로 받아야 한다고 정책으로 정해진 것이고 해당 값들이 있어야 저장을 시켜준다라고 정해진 이상 해당 값들이 없다면 그건 사용자가 아닌 것이고 저장을 해주면 안된다 라는 정책과 그럼 카카오로 부터 받은 값들을 필수 값이 들어오기 전까지 어디에 안전히 가지고 있을 지 문제에서 시작되었다 대안 1. 서버 내부 메모리에 저장 가장 간단한 방법이다 추가로 외부 리소스를 사용할 필요도 없고 내부에서 Map 형태로 우리가 만든 key 값, 사용자 정보 value로 저장을 한 후 해당 key 값을 제공하여 필수 정보 값과 같이 요청에 담아 보내도록 하면 된다 하지만 단점으로는 서버가 증가한다면?..

    이력서 저장 테이블 구조 재구성

    이력서 저장 테이블 구조 재구성

    배경 일단 동작되게 만들어!!! 이게 문제였는지 현재는 너무 화면에 치중된 ERD가 나오고 화면이 바뀌면 Controller, Service, Repository, 심지어 Database까지 모두 변경이 이루어지게 된다 (천지개벽!) 또 화면에 ERD를 맞추다 보니 API를 찍어내는 것 이외의 작업이 없다 또한 추후 커스텀한 템플릿을 만들어 제공을 해주기 위한 Should 기능이 있는데 이러한 정적으로 구조화된 DB를 가지고서는 유연하게 많은 구조를 저장을 하기 불가능 하다고 생각이 되어 이를 하나의 테이블로 변경을 해보고자 한다 현재 화면 상태 및 ERD 구상중인 새로운 Entity 이를 해결할 방법으로는 다단계 Table!! 하나가 여러개를 계속해서 증식할 수 있고 최고 등급 컬럼이 모든것을 먹을 수..

    Git Branch Linear

    Git Branch Linear

    Git Branch Linear 배경 기존에는 아무 생각 없이 Branch만들고 Merge를 진행하면서 Branch 관리에 대해서 별 다른 생각과 노력을 하지 않은 채로 개발을 진행해 왔지만 이번에는 Branch를 linear하게 관리를 하고자 한다 처음에는 그냥 rebase하고 squash하면 되는거 아니야? 가장 최신 시점에서만 merge하면 되겠네! 라고 생각을 했지만 시점을 잘못 파악해 몇 번의 문제점이 생기고 Linear하지 못하게 관리가 되게 되어 PR을 다시 올리고 Branch를 다시 만드는 과정을 몇번이나 진행하게 되었다 그리고 또 하나의 고민되었던 부분은 Github PR에서 Rebase And Merge, Squash And Merge 를 하게 되면 Fast Forward 와 같이 계속..

    Nginx 적용기

    SSL/TLS SSL(Secure Sockets Layer) 및 TLS(Transport Layer Security)는 통신 세션의 데이터를 암호화하여 인터넷을 통한 통신이 보안되게 하는 프로토콜 SSL데이터 등의 전송되는 정보를 보거나 훔치는 것을 방지 SSL은 사용되지 않음 TLS 사용 웹사이트와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술 TLSSSL이 일반적인 용어이기 때문에 DigiCert는 보안 인증서를 여전히 SSL로 언급하지만 DigiCert에서 SSL을 구입하면 가장 신뢰할 수 있는 최신 TLS 인증서를 얻을 수 있음 SSL의 향상된 버전 Nginx란 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반구조의 웹..

    Git Submodule 적용기

    Git Submodule 적용기

    배경 2차 팀 프로젝트를 하면서 외부에 노출되면 안되는 값(DB 주소, 비밀번호, JWT 생성 키 등)들을 관리하기 위해서 Github Environment secrets, Dock .env 파일, Git Submodule 중에서 선택을 하게 되었다 선택을 하게 된 이유로는 아무래도 추가적인 Github Repository에서 관리할 수 있고 Versioning도 되고 여러 파일로 나눠 특징 별로 application-jwt.yml application-db.yml와 같이 파일을 나눠 관리 및 추가와 수정 삭제등이 용이하다는 장점들 때문이다 Submodule 이란 쉽게 말하자면 Git 저장소 안에 Git 저장소를 만들어 넣는 것이다 당연히 .git 폴더가 각각 생기고 개별적으로 Version, Commi..