Cache 성능 테스트 중 생긴 의문점
·
개발/개발일기
Cache에 대한 기본 개념을 익히기 위해 프로젝트 진행중에Cache를 적용한 API와 미적용된 API를 성능 비교 테스트를 하던 중 생긴 의문점에 대해 정리한다.우선 이와 같은 성능 테스트라는 것을 처음 접해보기 때문에 어떤 식으로 환경을 세팅하여야 하는지 감이 오지 않았다.그래서 임의적으로 총 10000번의 요청횟수는 동일하게 되, 쓰레드수와 반복 요청 수를 늘리고 줄여가며 여러번 진행하였다.(테스트 툴은 JMeter를 이용했다.)테스트 시나리오: 총 500만개의 데이터, 10개의 사이즈로 이루어진 페이징된 목록을 조회하는 API 호출 1번째2번째3번째쓰레드10020003333요청수10053  1번째2번째3번째No Cache6000ms6000ms11000msRedis Cache6ms5000ms1000..
[TIL #40] 자바에서 데이터베이스 접근하기
·
개발/내일배움캠프 TIL
그동안 캠프를 진행하면서 여러 과제와 프로젝트를 쉬지 않고 진행하는 바람에 캠프 진행도에선 Spring 에 대한 공부과정은 끝났는데 정작 Spring 에 대해서 정말 제대로 이해하고 사용하고 있는 것일까? 란 질문을 스스로 던져보면 '아니요' 라는 답이 나온다.그래서 다시 돌아온 학습주차때 스프링에 대해 다시 심도있게 공부하는 시간을 가지기로 하였다. 자바에서 데이터베이스와 상호작용하는 법서버와 데이터베이스의 기본적인 통신 방법TCP / IP 를 사용해 커넥션을 연결연결이 완료되면 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 전달DB를 받은 SQL을 실행하고 결과를 응답여기서 중요한 것은 2. DB가 이해할 수 있는 SQL을 연결된 커넥션이다.관계형 데이터베이스는 종류가 많아 커넥션을 연결하는..
[TIL #39] 탈퇴한 회원 관리 테이블 분리 VS 필드 트러블 슈팅
·
개발/내일배움캠프 TIL
아웃소싱 프로젝트를 진행중 요구 조건에 탈퇴한 사용자는 아이디를 재사용할 수 없다는 내용이 있었습니다.이 요구 조건을 맞추기 위해 회원 테이블에 Enable, Disable 을 Enum 타입의 필드 주어 활성화, 비활성화 계정을 나누는 것과탈퇴한 회원 아이디를 저장하는 별도의 테이블을 만들어 관리하는 것 두가지 방향이 제시되었습니다. 그리고 필드를 추가하면 유저를 조회할 때마다 회원이 활성화되있는 지 조건이 항상 붙어 성능적인 면에서 불리할 것 같다는 의견이 있어두 케이스를 비교해보기로 하였고.  필드추가 방식과 테이블분리 방식 이라 부르겠습니다.필드추가 방식 Entitypublic class UserEntity extends BaseEntity { @Id @GeneratedValue(strateg..
[TIL #38] Spring 심화 주차 과제 Lv 6 기능 개선하기
·
개발/내일배움캠프 TIL
1. 문제 인식 및 정의과제에서 제공된 프로젝트에서 API를 하나씩 테스트해보다가 일정에 매니저를 등록하는 코드에 문제가 있는 것을 확인했다.담당자 등록 권한을 확인하는 로직에서 에러 메세지가 명확하지 않다는 것같은 유저를 계속 매니저로 등록할 수 있다는 것 2. 해결 방안메세지를 다음과 같이 좀 더 명확하게 수정하였다. - 이전 메세지: 담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.- 변경된 메세지:  담당자를 등록할 권한이 없습니다. 일정 작성자만 담당자를 등록할 수 있습니다. 두번째로 매니저를 등록할 때 유저를 조회하는 코드 바로 뒤에 해당 유저가 매니저로 등록되어 있는 지 확인하는 코드를 추가해주었다. Spring 의 JpaRepository 의 메서드명으로 쿼리를 작성해..
Spring 뉴스피드 프로젝트 미니 발제 KPT 회고
·
개발/내일배움캠프 TIL
KEEP처음 목표로 한 지점을 끝까지 완료 한 것클린코드를 최대한 적용하려고 한 것문제가 생겼을 때 팀원 모두가 해당 문제에 집중하여 해결하려고 노력한 것 PROBLEM깃허브 협업 전략 미숙목표를 조금 낮게 두더라도 사전에 깃허브 협업 전략에 대해 팀원들과 소통하여 구조적으로 탄탄하게 시작하지 못 한 부분이 아쉽습니다.해결 방안: 초기에 팀원들과의 깃 컨벤션이나 브랜치 전략을 탄탄하게 계획하여 협업하는 데에 있어 문제를 최소화하여 시간을 절약할 것입니다.코드 컨벤션 정의 부실위와 같은 문제로 깃허브에 시간을 많이 쏟다보니 시간부족으로 팀원들과의 코드 컨벤션을 지키지 못 하고 제 각각 스타일대로 코드가 작성되어 서로의 코드를 보고 바로 이해하는 데에 어려움이 있었던 것 같습니다.해결 방안: 코드 컨벤션 또..
[TIL #37] JPA를 이용한 일정 과제를 하면서 배운 내용 + 트러블 슈팅 기록
·
개발/내일배움캠프 TIL
이번 과제는 저번 과제에 진행했던 Spring 을 이용한 기본적인 CRUD를 구현하고 거기에 SQL을 직접 작성하는게 자바의 객체와 관계형 데이터베이스를 편리하게 매핑해주는 JPA라는 ORM 기술을 이용해보는 것이 추가되었다. 지속적으로 스프링에 대해 깊게 공부하려고 여러 강의를 보면서 진행해서 과제를 하는데에 있어 큰 어려움은 없었고 하면서 배운 것들과 문제가 있었던 것을 기록한다. Session로그인 상태를 유지하기 위해 로그인 정보(email, password)를 계속 파라미터로 보내는 건 매우 비효율적이다. 그래서 쿠키라는 것을 이용해 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달하면 그 뒤 모든 요청에는 쿠키가 자동적으로 포함되어 로그인 상태를 확인할 수 있다. 하지만 쿠키는 ..
[TIL #36] Spring 에서의 검증
·
개발/내일배움캠프 TIL
BindingResult@PostMapping("/add")public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult,RedirectAttributes redirectAttributes) 다음과 같이 검증할 객체 뒤에 파라미터를 위치하여 사용한다.객체를 `@ModelAttribute` 에 바인딩하는 과정에서 어떠한 검증과정을 거칠 때 오류가 나면 그 오류를 `BindingResult` 에 저장한다.그리고  `FieldError`, `ObjectError` 생성자를 제공하는데 필드 또는 객체 자체에 오류가 났을 때 그 정보를 객체로 생성하여 `addError` 를 통해 `bindingResult` 에 값을 담을 수 있다. `..
[TIL #35] 빈 생명주기 콜백
·
개발/내일배움캠프 TIL
스프링 빈의 이벤트 라이프사이클스프링 컨테이너 생성스프링 빈 생성의존관계 주입초기화 콜백객체 사용소멸 전 콜백스프링 종료이와 같이 객체의 메서드들이 실제로 실행되기 위해선 3. 의존관계 주입까지 마치고 나서 필드 초기화가 진행되야한다. 그렇기에 이 시작시점과 종료시점을 지정할 수 있는 방법들을 알아봤다. 인터페이스(InitializingBean, DisposableBean)설정 정보에 초기화 메서드, 종료 메서드 지정@PostConstruct, @PreDetroy 에노테이션 일단 3가지 방법 중 결론은 3. 에노테이션을 쓰는 것인데 왜 그런지 알아보자. 1. 인터페이스 (InitializingBean, DisposableBean)인터페이스이므로 객체 클래스 뒤에 `implements` 로 붙여 사용할 수..
[TIL #34] 스프링 페이지네이션 구현
·
카테고리 없음
스프링에서 제공하는 `Pageable` 인터페이스로 간단하게 페이지와 페이지의 사이즈를 정해 데이터를 가져오는 기능을 구현해보았다. `Pageable`은 페이지 요청 정보를 캡슐화하는 인터페이스로, 페이지 번호, 크기, 정렬 기준 등으로 설정할 수 있는데 일반적으로는 JPA 에서 페이징 로직을 지원 하는 메서드와 함께 사용하는 것 같았다. 하지만 이번 과제는 JDBC를 사용하기로 했기 때문에 `Pageable` 인터페이스만 사용해보고 나중에 JPA로 넘어가게 됐을 때 제대로 써보는 것이 좋을 것 같다.  @GetMapping("/lists") public ResponseEntity> findListSchedules( @RequestParam(required = false) St..
[TIL #33] 컴포넌트 스캔 탐색 위치와 기본 스캔 대상
·
개발/내일배움캠프 TIL
모든 자바 클래스를 다 스캔하면 시간이 너무 오래 걸리기 때문에 탐색을 할 시작 위치를 정할 수 있다.@ComponentScan( basePackages = "hello.core",} 위와 같이 시작 위치를 정하면 시작 패키지를 포함한 하위 패키지를 모두 탐색한다.지정하지 않으면 @ComponentScan 이 붙은 클래스 패키지부터 시작한다. 보통은 프로젝트 시작 루트 위치에 두고 생략하는 것이 관례라고 한다.