BACKEND 60

@SpringBootTest, @MockBean, Mockito, Junit 등 테스트에 대해서…

MockMvc?MockMvc란MVC에 관련된 Mock 가짜 객체웹 어플리케이션을 서버에 배포하지않고, 테스트용 MVC 환경을 만들어서 요청 및 전송, 응답 기능을 제공해주는 객체MockMvc를 통해 @Autowired로 주입받아서 사용 가능 @SpringBootTestSpringApplication을 통해서 테스트에서 사용할 ApplicationContext를 쉽게 생성할 수 있습니다.그러므로, @SpringBootAplication이 붙은 어노테이션을 찾아 하위의 모든 빈들을 scan하기 때문에 애플리케이션에 정의된 모든 빈을 생성하여 ‘실행 시 느려질 수 있으므로, 단위 테스트에서는 적합하지 않다.’@SpringBootTest@AutoConfigureMockMvc //SpringBootTest에서는 ..

업캐스팅, 다운캐스팅에 대해

목표코딩테스트 공부하는 중, 이진탐색 문제를 풀면서 언제 (long) 을 써야하고 언제 Long.parseLong을 써야하는지를 암기적으로 알고 있는 상태를 발견 후, 이를 정확히 알고 넘어가고자 포스팅한다. 원시타입, 참조타입⭐ 원시타입 (primitive type)정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입ex) Boolean Type (boolean), Numeric Type(short, int, long, float, double, char)  ⭐ 참조타입 (reference type)객체(Object)의 번지를 참조(주소를 저장)하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입example) 문자열, 배열, 열거, 클래스, 인터페이스ex) Class Type,..

벌크연산을 통한 update 성능 개선 시도 그리고 일반 연산과의 비교

💡 Issue기존에는 각각의 데이터 중 30일이 지난 데이터를 dirty checking 하여 status를 update했음 UPDATE "Sbom_History" SET status = 'exp' WHERE DATE(created_at) 실제로 단건의 dirty checking이었으므로 DB에 반영하는 매 건마다 커넥션을 가져오고, Commit을 하는 과정에서 비용이 발생하여 성능적으로 문제가 발생할 것이 우려됐다.앞으로 많은 양의 sbom 발급본이 저장될 경우를 대비하여 개선이 필요하다. 💡 MyBatis에서 Bulk 연산기존에 사용하는 JPA가 아닌, MyBatis에서 Bulk 연산을 시도한다.foreach 태그를 사용하여 리스트나 배열의 각 아이템에 대한 업데이트 쿼리를 동적으로 생성f..

MultipartFile와 Ajax를 활용한 파일 업로드

💡 IssueType을 File로 선택시, 로컬에서 파일을 서버로 전송하여 저장하는 로직을 구현하는 중이다.파일을 서버로 전송할 때, 주로 Multipart-File을 자주 사용한다. 💡 Multipart-File이란?클라이언트와 서버간에 전송되는 HTTP 요청-응답에서 주로 파일 업로드와 관련한 데이터를 전송할 때 사용된다.HTTP는 기본적으로 텍스트 기반 (JSON)으로 요청-응답하지만, 파일과 같은 이진 데이터를 전송해야할 때는, 이진 데이터를 텍스트 형식으로 인코딩하는 과정이 비효율적이며 제한적이다.🔑 Multipart는 이러한 이진데이터(파일)을 인코딩하지 않고, 원본 형식 그대로 전송할 수 있다.이를 사용하려면, HTTP Content-Type Header에 ‘multipart/form-..

Transaction의 전파 (feat. REQUIRES_NEW의 문제점)

💡 Issuesyft 발급을 마무리하고, database에 완성된 syft와 관련된 정보를 업데이트 해주어야 한다.이를 위해, 2개의 service 로직을 분리한 뒤, 처음에는 첫번째 로직에 영향을 받는 Propagetion.REQUIRED (default) 로 진행을 했다.첫번째 로직 (SYFT 기본 정보 삽입) 이 무조건적으로 있어야, 2번째 로직 (SYFT 발급 정보 업데이트)가 가능하다고 생각했다.하지만, k8s_resource_v1.0.0.tar와 같이 약 6gb가 넘는 파일을 sbom 발급에 추가시, HIKARIPool이 계속해서 만들어지면서 Connection Leak 현상을 겪었다./** * SYFT 응용 로직 * * @param type : SBOM 타입 (SPDX, Cyclo..

Kernel, Kernel Module

커널이란 ?OS에서 가장 핵심적인 역할인 자원(메모리, 프로세서 등)을 관리하고, 시스템이 원활하게 돌아갈 수 있도록 제어해주는 공간을 의미ex) 리눅스(OS)라 하는 것도, 실제적으론 리눅스란 os의 커널 이름을 말하는 것이고, 이게 확장된 의미로 사용되어 현재의 ‘리눅스’라는 OS로 지칭하게 된 것메모리에 상주하고, CPU에 명령을 내리는 소프트웨어⇒ 하드웨어와 프로세스를 잇는 핵심 인터페이스이다. (통신 효과적으로 하기 ! ) 커널 모듈이란?요청 시, 커널에 로드 및 언로드할 수 있는 코드 조각시스템을 다시 부팅하지 않고, 커널에 로드하거나, 언로드할 수 있는 코드관리자가 필요할 때마다 장치 드라이버를 통합하거나, 새로운 커널 기능을 활성화하는 데 유용하다 💡 초창기의 커널은 ?지원할 하드웨어가 ..

BACKEND/LINUX 2024.07.03

Symbolic Link, Hard Link 란 ?

Symbolic Link란?Linux와 Unix 기반 OS 체제에서 파일 디렉터리에 대한 간접적인 참조를 만드는데 사용되는 파일Symbolic Link는 디렉터리 경로를 갖고 있음⇒ 원본 파일이나 디렉터리에 대한 참조를 제공함원본 파일의 경로를 저장하기에, 매우 작은 크기의 파일Inode를 공유하지 않음 : (파일의 메타데이터 정보를 저장하는 Inode)원본 파일이나 디렉터리가 삭제되면, 더 이상 유효하지 않게 됨하지만, 원본 파일이나 디렉터리를 삭제하지 않고 심볼릭만 삭제하면 원본은 계속 존재함Hard Link란?파일에 대한 추가의 파일 이름(경로)를 생성하는 메커니즘같은 Inode 번호를 공유하는 두 개의 파일 엔트리를 만들어내는 것그러므로, 디스크 공간을 절약할 수 있음⇒ 하드링크를 생성하더라도, ..

BACKEND 2024.07.02

Sudo, Su, - 를 활용한 Linux 명령어 사용

Linux 특징Linux는 다중 사용자 시스템 (Multi-User System)한 대의 OS에 여러 사용자가 접속해서 사용 중서버용 OS로 주로 사용되기에 권한에 대한 관리가 매우 엄격함그렇기 때문에, 슈퍼유저의 권한으로 명령어를 실행root 사용자를 포함한 다른 계정으로 전환하는 명령어를 실행⇒ Root (슈퍼유저의 권한)이 매우 필요함sudo일반 사용자가 root 권한을 잠시 빌려 명령을 실행하게 하는 명령어‘권한’만 잠시 빌리는 것 ⇒ 근본적으로 명령을 내리는 주체는 현재 사용자 !└ 생성, 수정, 삭제 등 이력이 남는 작업을 했을 때, root 유저가 아닌 해당 유저의 이름이 남음sudo 명령어를 사용하면, root 사용자가 아닌 현재 로그인한 일반 사용자의 비밀번호를 요구⇒ 기본적으로 sudo..

BACKEND/LINUX 2024.07.02

[Spring Security + JWT + OAUTH2] 카카오/네이버 외부 로그인 구현

Security, JWT, OAuth2에 대한 지식이 하나도 없는 상태에서 카카오 로그인 기능을 담당하게 됐다. 언젠가 security를 직접 구현해보고 싶다는 생각이 있었는데 이번 기회에 구체적으로 알아가려 한다! 기본적인 지식이 없었기에 헤매고 헤맸지만, 모든트러블 슈팅들을 자세히 적어뒀으므로 해당 글을 읽고 나와 같은 개발자분들이 도움이 됐으면 좋겠습니다 🌱 ⚠️ 확인해주세요 ⚠️전체코드 및 서비스 정리로 나눠서 작성해뒀습니다. 제 글만 확인하시기 보단, 직접 Security가 제공하는 기본 구현체들을 확인하시면서 어떤 기능을 사용하고 계신지 확인해보시는걸 추천드립니다! 저 또한 상속받은 구현체들을 하나씩 확인해가면서 공부한 덕분에 구현에 도움을 받았습니다 🙂 (security 가 꽤.. 친절해..

HttpURLConnection을 이용한 API 데이터 받아오기

최근 프로젝트를 하면서 한국관광공사에서 제공하는 '무장애여행정보' OPEN API를 활용하여 데이터를 DB에 저장하는 업무를 맡았다. 이전에 관광공사의 숙소정보를 활용해 DB에 저장해본 경험이 있는데 이번 기회에 HttpURLConnection에 대해 다시한번 정리해보고자 한다. 🌱 URL 객체 생성Http 연결 : HttpURLConnectionURL 내용을 읽어오거나, URL에 GET, POST 방식으로 데이터를 전달⇒ 웹페이지나, 서블릿에 데이터 전달 가능URL 클래스 이용해 생성자 생성URL에서 URLConnection 객체 얻기openConnection()을 이용해 url 연결url 존재 : 한국관광공사에서 발급한 개인 key를 Query Parameter로 넣어준다. (명세서 기반)URLCo..