전체 글 89

[TIL] CS공부 2일차

JPA의 더티 체킹이란 무엇인가요? Dirty는 데이터의 변경된 부분을 뜻하며 Dirty Checking은 데이터의 변경된 부분을 검사하는 것을 뜻합니다. 대표적으로 데이터 update 시 사용되는데, 따로 update에 관한 쿼리를 작성하지 않아도 dirty checking을 통해 변경된 부분을 감지하여 데이터 업데이트를 수행하기 때문에 코드의 복잡성을 줄일 수 있습니다. 더티 체킹은 영속성 컨텍스트가 관리하는 엔티티에만 적용되며, Transaction이 커밋되기 전까지 변경사항을 추적하여 스냅샷을 만들어놓고 Transaction이 커밋된 시점에서 스냅샷과 비교해 변경된 사항이 감지되면 update 쿼리를 데이터베이스로 전달하여 엔티티의 변경된 상태를 반영합니다. 하지만 Dirty Checking으로 ..

++/CS 2024.03.06

[회고] 뉴스피드 개인 프로젝트 마무리

5주간 개인 프로젝트를 진행하였다. 혼자서 해보는 개인 프로젝트가 처음이라 시작하기 전 약간의 설렘이 있었지만 프로젝트 경험이 적어 혼자 해낼 수 있을까하는 두려움, 막막함이 더 컸다. 다행히 같은 주제로 프로젝트를 진행한 다른 분들의 도움을 많이 받기도 하고 내가 아는 선에서 도움을 줄 수 있는 부분도 있어서 개인 프로젝트지만 팀 프로젝트처럼 으쌰으쌰하면서 매일 늦은 시간까지 남아 프로젝트를 진행할 수 있었다. 이제 마무리하는 시점에서 프로젝트 진행 타임테이블, 내용, 기술적 의사결정과 이전에 비해 더 나아진 점, 아쉬운 점을 정리해보고자 한다. 일정 2024. 01. 24. ~ 2024. 02. 28.(5주) 기술적 의사결정 Java 17 운영체제나 플랫폼에 독립적인 프로그래밍 언어로 객체지향적 설계..

[TIL] CS공부 1일차

Call by reference란 무엇이고 보통 어떻게 쓰이나요? Call by reference는 함수 호출 방법 중 하나로 참조에 의한 호출이라고 합니다. 함수 호출 시 인수로 전달되는 변수의 값 주소를 참조하는 방식으로 별도 메모리를 사용하지 않고 주소만 참조하기 때문에 빠르다는 장점이 있으나, 호출된 함수에서 해당 값이 변경될 경우 원래 값에도 영향을 준다는 단점이 있습니다. Call by reference와 달리 Call by value는 값에 의한 호출로, 값을 복사하여 처리하는 방식입니다. 원래 값이 보존될 수 있다는 장점이 있지만 복사로 인해 메모리 사용량 증가한다는 단점이 있습니다. C언어에서는 포인터 변수(*)를 파라미터로 지정하고 함수 호출 시 주소연산자(&)를 이용해 매개변수의 주소..

++/CS 2024.03.05

[성능 테스트][트러블 슈팅] Artillery를 이용한 부하 테스트 - 3 (성능 개선)

[성능 테스트][트러블 슈팅] Artillery를 이용한 부하 테스트 - 2 (성능 저하 요인 찾기) [성능 테스트] Artillery를 이용한 부하 테스트 -1 (테스트 설정, 결과 보기) 테스트 도구 선택 - Artillery Artillery는 Node.js 기반의 성능 및 부하 테스트를 위한 오픈 소스 도구로 HTTP, WebSocket 및 TCP 등 다 writtenbyrla.tistory.com 지난 글에서는 부하 테스트를 통해 문제를 인지하고 성능 저하에 영향을 미칠만한 요인을 추측해 보았고, 이번 글에서는 해결하는 과정과 결과를 담아보고자 한다. ++ 모든 부하 테스트는 외부적인 요인에 영향받지 않기 위해 다른 요인들은 건드리지 않고 일정한 환경에서 진행했다. 시도한 방법 1 - fetch..

[성능 테스트][트러블 슈팅] Artillery를 이용한 부하 테스트 - 2 (성능 저하 요인 찾기)

[성능 테스트] Artillery를 이용한 부하 테스트 -1 (테스트 설정, 결과 보기) 테스트 도구 선택 - Artillery Artillery는 Node.js 기반의 성능 및 부하 테스트를 위한 오픈 소스 도구로 HTTP, WebSocket 및 TCP 등 다양한 프로토콜을 사용하여 테스트가 가능하며 YAML을 사용하여 시나리오 writtenbyrla.tistory.com Artillery를 이용하여 간단하게 테스트를 해 본 지난 글에 이어 프로젝트에 부하 테스트를 적용시켜 보는 이번 글 게시글 기능이 유저, 멀티미디어, 게시글 좋아요까지 여러 엔티티와 연관관계로 묶여 있는 데다가 피드 서비스의 핵심 기능이기 때문에 게시글 전체 목록을 받아오는 API를 선택해서 성능을 제대로 측정해 보기로 했다. 성능..

[성능 테스트] Artillery를 이용한 부하 테스트 -1 (테스트 설정, 결과 보기)

테스트 도구 선택 - Artillery Artillery는 Node.js 기반의 성능 및 부하 테스트를 위한 오픈 소스 도구로 HTTP, WebSocket 및 TCP 등 다양한 프로토콜을 사용하여 테스트가 가능하며 YAML을 사용하여 시나리오를 정의하므로 테스트 시나리오를 쉽게 작성할 수 있다는 장점이 있다. 또한 분산 테스트를 지원하여 여러 호스트에서 동시에 테스트를 실행하고 결과를 집계할 수 있으며 이를 통해 대규모 시스템의 성능을 테스트할 수 있다고 한다. Apach의 JMeter도 많이 사용하는 것 같았으나 Artillery가 좀 더 초심자가 사용하기에 쉬운 편이기도 하고 사용법에 대한 리소스도 많이 있어 Artillery를 이용하였다. 처음 해보는 부하 테스 트인 만큼 테스트 도구를 사용하는 데..

[단위 테스트/Mockito] 게시글 서비스레이어 단위 테스트 - 2 (with JUnit 버전 문제)

단위 테스트 이전 글 [단위 테스트/Mockito] 게시글 서비스 레이어 단위 테스트 - 1 (with ReflectionTestUtils) MockMvc를 이용하여 컨트롤러 통합테스트를 끝냈다. 테스트를 위한 별도 DB를 생성하여 모든 예외사항에 대해 전체 테스트를 끝냈는데, 아무리 생각해도 비즈니스 로직은 서비스단에 포함되어 있 writtenbyrla.tistory.com Mockito를 사용해서 서비스 레이어 단위 테스트를 열심히 하다가 또 한 번 위기를 겪었다. Mockito에서 Mock 객체를 사용하기 위해서 테스트 파일에 어노테이션을 달아주는데, 나는 계속해서 JUnit4 방식인 @RunWith(MockitoJUnitRunner.class) 어노테이션을 달고 있었고, JUnit5 방식은 @Ex..

[단위 테스트/Mockito] 게시글 서비스 레이어 단위 테스트 - 1 (with ReflectionTestUtils)

MockMvc를 이용하여 컨트롤러 통합테스트를 끝냈다. [통합 테스트/MockMvc] 어쩌다 회원 가입만 290번 처음 해보는 통합테스트. 개발용 DB의 영향을 최소화하고자 테스트용 DB를 따로 만들어 연결하고 테스트를 진행하였다. 문제 상황 1. [ DB 연결 문제] 개발용 DB를 MySQL로 사용하고 있기 때문에 혹시 writtenbyrla.tistory.com 테스트를 위한 별도 DB를 생성하여 모든 예외사항에 대해 전체 테스트를 끝냈는데, 아무리 생각해도 비즈니스 로직은 서비스단에 포함되어 있으면서 테스트 하는동안 db에 영향을 많이 받는다는 생각이 들었다. 컨트롤러에서 통합 테스트를 하는 것이 필요없는 것은 아니지만 이미 개발을 진행하면서 postman으로 테스트해본 내용과 거의 일치하기 때문에..

[통합 테스트/MockMvc] 어쩌다 회원 가입만 290번

처음 해보는 통합테스트. 개발용 DB의 영향을 최소화하고자 테스트용 DB를 따로 만들어 연결하고 테스트를 진행하였다. 문제 상황 1. [ DB 연결 문제] 개발용 DB를 MySQL로 사용하고 있기 때문에 혹시나 영향이 갈까 봐 H2를 이용하여 테스트용 DB를 분리하였다. 하지만 H2에서는 user를 예약어로 사용하고 있어 User 엔티티 생성에 있어 문제가 생겼고 MySQL로 변경하여 테스트용 스키마를 별도 생성해서 연결해 주었다. 2. [ Primary Key 자동생성 문제 ] @BeforeEach 어노테이션으로 테스트 실행시마다 유저를 생성하여 테스트를 진행하고자 했는데, 언젠가부터 처음에 통과하던 테스트 코드도 다시 실행해 보면 다 유저정보를 찾을 수 없다는 오류가 뜨고, 나중에는 결국 모두 실패하..

[Spring boot + thymeleaf] 화면단 연결 고군분투기

++ Spring Security와 Jwt를 곁들인... 기본적인 api 구현을 끝내고 회원가입, 로그인 화면단 연결을 목표로 타임리프를 이용하여 프론트 작업을 하였으나 로그인 후 페이지 이동시 403 Forbidden 오류로 이 작업을 이틀정도 핸들링했다. ajax나 fetch를 이용한 javascript 문법 미숙으로 인한 오류인 줄은 알고 있었으나 거기에 더해 토큰을 운용하는 과정에서 클라이언트단과 서버단에서 헤더, 쿠키방식을 혼용했기때문에 발생한 대참사였다. 사실 react와 같은 프레임워크를 이용하여 클라이언트단 서버를 분리하면 route를 이용해서 리다이렉션을 처리할 수 있을텐데, 템플릿 엔진 + rest api 방식을 이용하다보니 페이지 넘김에 있어서 꼬이고 꼬였고 프로젝트를 한번 엎고 다시..