본문 바로가기

Study/개발일지

[백엔드TIL] Spring security 로그인 실패 시 예외처리 방식(78일차) 스프링 시큐리티로 로그인기능을 구현하다가 어떤 이유에서든지 로그인에 실패하면 로그에 아무것도 안뜨길래 뭔가 설정을 잘못한 줄 알았다. 분명 에러 로그가 떠야하는데 안뜬다. 로그 범위를 디버그로 하면 겨우 보이는데 다른로그들이 엄청나게 튀어나온다. 딱 한줄 보여준다... 세션에서 확인해봤다. 친절하게도 BadCredentialsException : 자격증명에 실패했다고 알려준다. 없는 아이디를 입력했으므로 UsernameNotFoundException을 기대했지만 BadCredentialsException이 떴다 로그를 찍어보면 분명 'org.springframework.security.core.userdetails.UsernameNotFoundException'이 발생했다. BadCredentialsEx.. 더보기
[백엔드WIL] DB캐싱 (16주차) Cache Cache는 데이터나 값을 저장하는 임시 저장소로, 데이터를 더 빠르고 효율적으로 액세스할 수 있게 해준다. 원본 데이터 접근보다 빠르다. 같은 데이터를 반복적으로 접근하는 상황에서 사용하기에 알맞다. 인증 세션 값과 같은 잘 변하지 않는 데이터일수록 더 효율적이다. CPU Cache 레이어별로 캐시를 보면 용량은 위로 갈수록 커지고 속도로 밑으로 내려갈수록 빨라진다. 보통 우리가 사용하는 Redis는 Memory층에 존재한다고 보면 된다. Disk가 제일 느리고 L3 < L2 < L1 순으로 속도가 빠르다. Disk 접근 속도가 SSD를 쓰고있지만 Memory와 비하면 속도가 굉장히 차이난다. 그렇기 때문에 Memory에 올려놓고 쓰는 게 Disk에서 읽어오는 것보다 훨씬 빠르다. 그 대신 .. 더보기
[백엔드TIL] DB로직을 최소하려면 어떻게해야할까? (77일차) DB 로직 최소화를 하려면 어떻게 해야 할까요 DB 로직을 최소화하는 것은 성능을 향상시키고 유지 보수를 간소화하는 데 도움이 됩니다. 예를 들어, 이러한 방법으로 DB 로직을 최소화할 수 있다. EX. 일관된 데이터 모델링: 데이터베이스 테이블과 엔테테를 일관성 있게 설계하고 중복 데이터를 줄이고 일관성을 유지하여 데이터 중복을 최소화화고 무결성을 유지한다. 비즈니스 로직 최적화: 데이터베이스에서 비즈니스 로직을 수행하기보다는 비즈니스 로직을 애플리케이션 레벨에서 처리한다. 데이터베이스는 데이터 저장과 관리에 중점을 두는 것이 좋다. 캐싱: 반복적으로 동일한 데이터를 검색해야 하는 경우, 검색 결과를 캐시하여 데이터베이스 요청을 최소화할 수 있다. 배치 작업: 대량의 데이터를 처리해야 할 때는 배치 작.. 더보기
[백엔드TIL] Mockito를 활용한 단위테스트 (76일차) [ Mockito란? ] Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임워크이다. 일반적으로 Spring으로 웹 애플리케이션을 개발하면, 여러 객체들 간의 의존성이 생긴다. 이러한 의존성은 단위 테스트를 작성을 어렵게 하는데, 이를 해결하기 위해 가짜 객체를 주입시켜주는 Mockito 라이브러리를 활용할 수 있다. Mockito를 활용하면 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행할 수 있다. 물론 프레임워크 도구가 필요없다면 사용하지 않는 것이 가장 좋다. [ Mockito 사용법 ] 1. Mock 객체 의존성 주입 Mockito에서 가짜 객체의 의존성 주입을 위해서는 크게 3가지 어노테이션이 사용된다. @Mock: 가짜 객체를 만들어 반환해주는.. 더보기
[백엔드TIL] Spring 구조와 DDD 개발(75일차) Request 데이터를 받을 Dto API 요청을 받을 Controller 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service 여기서 많이 오해하고 있는 부분이 Service에서 비즈니스 로직을 처리해야 한다는 것이다. 하지만 전혀 그렇지 않다. Service는 트랜잭션, 도메인 간 순서 보장의 역할만 한다. 그럼 비즈니스 로직은 누가 처리할까? 바로, 도메인 Domain이다. Spring 웹 계층 구조 Web 계층 흔히 사용하는 컨트롤러(@Controller)와 JSP/ Freemarker 등의 뷰 템플릿 영역이다. 이외에도 필터(@Fiilter), 인터셉터, 컨트롤러 어드바이스(@Controller Advice)등 외부 요청과 응답에 대한 전반적인 영역을 나타낸다. Service 계층 @Ser.. 더보기
[백엔드TIL] Docker 설정하면서 트러블슈팅(74일차) [문제상황] ec2에 docker-compose로 스프링을 띄우고, ec2 로컬에 실행한 redis와 연결이 안되고 있다. [원인] application.yml에 작성한 redis의 호스트인 localhost(127.0.0.1)의 주소와 docker의 로컬 호스트 주소가 다르기 때문이다. redis: host: localhost port: 6379 [실행] host에 localhost 대신에 host.docker.internal로 수정한다. =>실패 docker redis network를 구축한뒤 실행된 도커 컨테이너와 연결해준다 =>실패 [해결] docker-compose.yml에 아래 extra_hosts를 추가해준뒤 extra_hosts: - "host.docker.internal:host-gate.. 더보기
[백엔드TIL] Docker 에 대한 이해(73일차) 도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트 입니다. 도커는 일반적으로 도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 말합니다. 도커 엔진(Docker Engine)은 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 프로젝트입니다. 도커의 생태계에 있는 여러 프로젝트들은 도커 엔진을 좀 더 효율적으로 사용하기 위한 것에 불과하기 때문에 도커의 핵심은 도커 엔진이라고 할 수 있습니다. Virtual Machine(가상머신) vs Docker Container(도커 컨테이너) 기존에도 가상화 기술은 존재해왔습니.. 더보기
[백엔드TIL] EC2에 cloudwatch를 사용하여 성능체크(72일차) 개요 https://dev.classmethod.jp/articles/try-installing-cloudwatch-agent-on-ec2-instances/ 해당 글을 보고 재정리했습니다. 필자는 Ubuntu 운영체제를 사용하는데, 해당 글은 yum 명령어를 사용합니다. 이후에 더 원활하게 세팅하기 위해 해당 글을 다시 정리해서 작성했습니다. AWS는 기본 설정에서 메모리를 모니터링할 수 없습니다. 프리티어를 사용한다면 메모리가 부족한 만큼 메모리에서 문제가 발생할 확률이 높습니다. 따라서 메모리를 모니터링하는 방법을 아래 정리해두었습니다. EC2, Ubuntu 22.04 환경에서 작업했습니다. 순서 IAM Role 생성 필자의 생각에 Role은 여러 권한을 가지고 있는 무언가라는 의미로 자주 쓰여지는.. 더보기
[백엔드TIL] mysql db 연결 시 주요 에러 (71일차) ❓ org/mariadb/jdbc/Driver : Unsupported major.minor version 52.0 👉 Java와 MariaDB 버전 맞추기 (버전 확인하는 곳) ❓ Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl 👉 해결1) application.properties에서 설정한 url에 오타 없는지 확인 👉 해결2) localhost의 경우 아래와 같이 설정해야 함 spring.datasource.url=jdbc:mysql://localhost.com:3306/DB명 ❓ No session repository could be auto-configured, check your configuration (session store t.. 더보기
[백엔드TIL] react , typecript 에대한 개념 학습(70일차) tyepscript 도입을 위해 공부를 해보았다. typeScript의 주요 특징 : 정적 타입: TypeScript는 변수, 함수, 클래스 등에 명시적인 타입을 지정할 수 있다. 이는 컴파일 시점에 오류를 잡을 수 있으며, 코드의 가독성과 유지보수성을 향상시킨다. ECMAScript 호환: TypeScript는 JavaScript의 상위 집합이므로, 모든 JavaScript 코드가 TypeScript로 유효하다. 따라서 기존 JavaScript 코드를 그대로 사용하면서 타입 시스템을 점진적으로 도입할 수 있다. 클래스 기반 객체지향 프로그래밍: TypeScript는 인터페이스, 추상 클래스, 상속 등의 객체지향 프로그래밍 개념을 지원하여 코드의 재사용성과 구조화를 촉진한다. 타입 추론: TypeScri.. 더보기