1. CSRF란?CSRF는 웹사이트의 취약점을 이용하여 사용자가 의도하지 않는 행동을 유도하는 공격 Spring Security는 기본적으로 CSRF 보호를 제공하는데, 이는 Ajax 요청에도 적용됨. 따라서, 각 Ajax 요청에 CSRF 토큰을 포함해야 하며, 이를 누락하면 Spring Security는 해당 요청을 거부할 수 있음 Ajax : Asynchronous JavaScript and XML의 약자로, 웹 개발 기술의 하나입니다. Ajax를 사용하면 웹 페이지를 다시 로드하지 않고도 서버와 비동기적으로 데이터를 주고받을 수 있습니다. 이 기술을 통해 웹 애플리케이션은 사용자 경험을 더 동적이고 반응성이 뛰어나게 만들 수 있습니다. CSRF에 대한 사용 방식 사용자가 뱅킹 웹 사이트에 로그인하여..
3-2학기에 운영체제 과목에서 배운 프로세스와 스레드 개념을 복습해 보고, 이를 Spring Boot에서 어떻게 활용하는지 알아볼게요. 프로세스란? 프로세스는 실행 중인 프로그램의 가장 작은 단위로, 하나의 실행 흐름을 가진 프로그램을 의미해요. 즉, 프로그램이 메모리에 로드되어 실행되고 있는 상태를 프로세스라고 부릅니다. 예를 들어, 실행 중인 카카오톡이나 크롬 브라우저는 각각 하나의 프로세스로 동작합니다.각 프로세스는 자신이 소유한 자원을 보호하기 때문에, 다른 프로세스의 자원이나 메모리 영역에 접근할 수 없습니다. 실제 상용 시스템에서는 이러한 프로세스보다 더 작은 단위인 스레드 단위로 CPU 코어를 할당하여 스케줄링을 수행하고 있어요. 스레드란? 스레드는 프로세스 내에서 실행되는 흐름을 의미해요...
4번의 백엔드 네트워킹 및 과제를 하면서 이전에는 개발을 하면서 경험해보지 못한 많은 부분을 배웠다. 실제 서비스에서 발생할 수 있는 다양한 문제 상황 경험 그전에 백엔드 개발을 할 때는 대용량 트래픽, 대량의 데이터 등에 대해서 고려하지 하지 않고 기능 구현에 집중했다. 이번 네트워킹 과제를 진행하면서 로직상에 문제가 없다고 생각한 기능들도 실제로 많은 사용자가 동시에 접근하는 상황 또는 데이터가 많아지는 상황에서 내가 의도하지 않은 결과가 나오는 것을 확인했다. 특히 사용자가 몰릴 경우 race condition 문제가 실제로 발생해 데이터 일관성 문제가 발생함을 확인할 수 있었고, 데이터가 많을 경우 데이터를 저장하거나 조회하는데 상상 이상의 성능 감소가 발생함을 확인했다. 이를 통해 내가 알고 ..
기존 코드의 소요 시간 측정 @Transactional(readOnly = true)public PostListDTO getPostPreviewList(final int page) { Pageable pageable = getPageable(page); return PostListDTO.toPostListDTO(postRepository.findAllByOrderByViewsDesc(pageable));}@Query("SELECT p FROM Post p ORDER BY p.views DESC")Page findAllByOrderByViewsDesc(Pageable pageable); 기존 코드를 통해서 인기 게시글 조회 소요 시간을 측정하게 되면 다음과 같은 결과가 나오게 된다. 동시에 발생한 요청이 ..
2025년 개발자로서 이루고자 하는 목표를 적어보자. 😀 나의 2024년 2025년의 목표를 세우기 전에, 먼저 2024년의 나를 돌아봐야겠다. 2024년은 한마디로 매력 있는 백엔드 개발자가 되기 위해 고군분투한 시간이었다. 다양한 개발 프로젝트에 뛰어들며 배운 것을 실제로 적용해 봤고, 공모전에서 상까지 타며 뿌듯함을 느끼기도 했다. 특히 개발 동아리 활동은 정말 값진 경험이었다. 여러 분야의 사람들과 협업하면서 새로운 기술과 관점을 배우고, 개발자라는 정체성에 조금 더 자신감을 갖게 되었다. "이게 진짜 개발이라는 거구나"라고 느낄 정도로 흥미진진한 시간이 많았다. 공부도 열심히 했다. 운영체제, 보안, 데이터베이스 같은 3학년 전공 과목을 통해 소프트웨어 개발자의 시야를 조금 더 넓힐 수 있었다..
조회수 필드에 대한 문제 확인하기 // 단일 게시글 조회@Transactionalpublic PostDTO getPostById(final long id) { // 게시글이 존재하지 않을 경우 예외 처리 Post post = postRepository.findById(id).orElseThrow(() -> PostException.from(POST_NOT_FOUND)); // 조회수 증가 post.increaseViews(); // DTO로 변환하여 반환 return PostDTO.toPostDTO(post);}// 조회수 증가public void increaseViews() { this.views++;} 위 메서드에 대하여 같은 게시글에 대하여 요청이 들어올 경우, 해당 조회수에 대한 증가는 순차적으로..