BACKEND/JAVA & SPRING 43

@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..

[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..

Call By Value & Call By Reference 정리

정렬에 대해서 다시 공부하던중.. swap 함수를 작성하면서 Call By Value와 Call By Reference의 차이점을 정확히 알지 못한다는 사실을 깨닫고 지금이라도 공부해야겠다 생각했다.. 2024년도에는 모르는 것들을 꼼꼼하게 챙겨갈 수 있는 해가 되어야지 !! Call By Value : 값에 의한 호출 public class CallByValue { public static void main(String[] args) { int a = 1; int b = 2; int temp = a; a = b; b = temp; System.out.println("a: "+a+" b: "+b); // a: 2 b: 1 } } Call By Reference : 주소에 의한 호출 public class..

장바구니 api - Create 추가 #2 (Feat. SpringBoot)

로직 설명개발 에러 상황V1 serviceV2 serviceV2 service #2V2 service #3배운점 장바구니 api - Create 추가 #1 (Feat. SpringBoot) 에서 설명한 Table 구조에 따른 장바구니 추가 api 코드에 대해 설명하겠다. v1와 v2 기간을 거치면서 장바구니 api를 고도화했다. 간단한 api일줄 알았으나, 직접 개발을 하면서 여러 에러를 겪고 해결하며 성장할 수 있었다. 🌱로직 설명단기투숙startDate = 2023-11-29endDate = 2023-11-30roomProduct |2023-11-29| stock : 2장바구니 = 11월 29일만 담긴다.만약, 11월 29일의 재고가 이미 cart에 2번 담겨있다면, “상품의 재고 부족으로 장바구니 ..

장바구니 api - Create 추가 #1 (Feat. SpringBoot)

중간 테이블 java 구조 다대일 양방향 관계RoomCart.javaCart.java다대일 단방향 관계RoomCart.javaRoomProduct.java So2zy 프로젝트에서 장바구니 추가 api를 담당해서 개발을 했다. “야놀자”의 객실상품을 “장바구니”에 추가하는 로직을 구현해야하므로, ERD를 아래와 같이 작성해보았다. 🌱처음에는 ERD를 짤 때, Room, Cart 테이블만 존재하면 될 줄 알았다.. 😲근데, JPA 특성상 N:M관계는 최대한 지양하는 추세이므로 Room_cart와 Room_product라는 중간 테이블을 구현해야했다. ⚠️왜 N:M관계는 최대한 지양해야할까 ?JPA에서는 @ManyToMany어노테이션을 제공해준다.이 어노테이션은, 암묵적으로 중간 테이블을 생성해주어서 자기도 ..