전체 글 47

지연로딩(FetchType.LAZY)으로는 N+1 문제가 해결되지 않는 이유[미완]

CommentController 클래스의 getComments() API를 호출할 때 N+1 문제가 발생하고 있다.  여기서 N+1 문제란 뭘까? N+1 문제란? N+1 문제는 ORM 기술에서 특정 객체를 대상으로 수행한 쿼리가 해당 객체가 가지고 있는 연관관계 또한 조회하게 되면서 N번의 추가적인 쿼리가 발생하는 문제를 말한다. 왜 발생할까? N+1문제가 발생하는 근본적인 원인은 관계형 데이터베이스와 객체지향 언어간의 패러다임 차이로 인해 발생한다. 객체는 연관관계를 통해 레퍼런스를 가지고 있으면 언제든지 메모리 내에서 Random Access를 통해 연관 객체에 접근할 수 있지만 RDB의 경우 Select 쿼리를 통해서만 조회할 수 있기 때문이다.  N+1이 문제가 되는 이유N+1문제가 발생하면 쿼리..

JPA 2024.11.23

[JPA] JPA에 대하여(+Spring Data JPA)

JPA (Java Persistence API) JPA(Java Persistence API)는 자바 진영의 ORM(Object Relational Mapping/객체-관계 매핑) 기술 표준 명세로 JAVA에서 제공하는 API이다. 스프링에서 제공하는 것이 아니다. 데이터베이스와 객체 사이의 패러다임 불일치를 해소하고, 객체지향적으로 데이터를 관리할 수 있게 돕는다. JPA는 단순히 인터페이스 모음이며, 이를 구현한 대표적인 구현체로 Hibernate, EclipseLink 등이 있다. 단순히 인터페이스라는 점이라 JPA는 특정 기능을 하는 라이브러리가 아니다.   ORM이란? SQL Mapper와 ORM ORM은 DB 테이블을 자바 객체로 매핑하므로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성하지..

JPA 2024.11.21

[Spring]빌드하고 실행하기[미완]

[이유]    [윈도우 버전]   [출처]https://deepdeepblueblue.tistory.com/8 [스프링 입문] 빌드하고 실행하기 (영한쌤 윈도우도.. 알려주세요..)콘솔창에서 스프링 프로젝트를 빌드하고 실행하려고 한다. 윈도우는 강의에서 따로 설명해주시지 않아서 검색을 통해 해결했다. cmd창에서 프로젝트가 있는 경로로 이동한 후, dir 명령어로 gradledeepdeepblueblue.tistory.comhttps://sky-h-kim.tistory.com/27 [Windows] 특정 포트 실행중인지 확인 + 강제 종료가끔 IDE를 통해 톰캣을 재시작할때, 갑자기 8080포트(또는 기존에 사용하던 톰캣 포트)를 사용할 수 없다고 에러가 뜨는 경우가 있다. 포트가 정상적으로 종료되지 않..

Spring 2024.11.18

[Spring]JWT

1. JWT란? JWT(Json Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉 토큰의 한 종류이다. 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다. 앞서 쿠키-세션 방식을 공부했는데 JWT를 사용하는 이유에 대해 알아보자. 클레임(Claim)은 JWT 내에서 중요한 정보를 담고 있는 부분으로, 토큰의 인증 및 권한 부여, 데이터 전달 등 여러 목적을 위해 사용된다. 이 정보는 JWT의 페이로드(payload)에 담기며, 이를 통해 시스템 간에 다양한 정보를 안전하게 공유할 수 있다. 2. JWT 사용 이유 만약 서버가 1대인 경우1. 서버의 부하 증가Session1이 모든 클라이언트의 로그인 정보를 소유하고 있다고 하자. 이..

Spring 2024.11.08

[Spring] 쿠키와 세션 인증 방식

1. 인증과 인가 인증(Authentication)해당 유저가 실제 유저인지 확인하는 개념이다.예) 스마트폰 지문인식, 주로 사용하는 사이트에 로그인 인가(Authorization)해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념이다.예) 관리자는 관리자 권한으로 관리자 페이지에 접근할 수 있다.  2. 웹 애플리케이션 인증  일반적으로 서버 - 클라이언트 구조로 되어있고 실제로 이 두 가지 요소는 멀리 떨어져 있다. Http라는 프로토콜을 이용하여 통신하는데 이로 인해 비연결성과 무상태가 이루어진다. (HTTP의 특징!) 비연결성(Connectionless)서버와 클라이언트가 연결되어 있지 않다는 의미이다.그 이유는 리소스를 절약하기 위해서인데 실제로 계속 연결되어 있다면 서버의 비용이 ..

Spring 2024.10.31

[Spring] 로그(log)

로그란 대체 뭘까?로그는 스프링 프로젝트를 만들고 실행을 해보면 바로 볼 수가 있는데 날짜, 중요도, 발생한 위치, 내용 순으로 찍어준다. 로그는 디버깅할 때 코드 중간중간에 넣어서 확인용을 쓰이거나 요청 메세지를 찍고 싶을 때 쓴다.    System.out.println()와 한번 비교해보자. [결과]print문은 내용만 보여주는 반면 log는 언제 어디서 무슨 내용인지 보여준다.  만약 서버에서 Error가 나올 경우 그 Error가 언제, 어디서, 무슨 내용인지 알아야 한다. 따라서 실무에서는  log를 사용한다. 로그를 남기면 로그를 따로 뽑아서 파일 형태로 만들어서 모아 볼 수 있으며 디버깅할 때도 편리하게 쓸 수 있다.   @ Slf4j@ Slf4j는 다음 코드를 자동으로 생성해서 로그를 선..

Spring 2024.10.31

[Server]REST API이란 뭘까?

개요 프로젝트를 진행하면서 무엇을 가장 먼저 시작하는지 생각하면 프로그래밍이라고 생각하겠지만 바로 API 명세서 작성이다. 건물을 만들 때 무작정 철근부터 만드는 것이 아니라 설계도를 먼저 작성해서 건물을 세우는 것이 기능적은 물론 안정적이게 만들 수 있기 때문이다. 그리고 프론트엔드와 백엔드의 소통이 원활하게 이루어지기 위해서는 API 작성이 중요하다.  API 명세서를 작성할 때 항상 따라다니는 말이 있다. 그건 바로 'RESTful'이다. 'RESTful 하게 구현하는지', 'RESTful 해야 한다'라는 말이 항상 나오곤 한다. 이번 기회로 API는 무엇인지, RESTful 하다는 무슨 의미인지, 마지막으로 REST API이 무엇인지 알아보자. API(Application Programing In..

Server 2024.10.18

[트러블 슈팅] @Transactional이 필요한 이유

1. 개요 기능을 테스트하기 위해 postman을 사용하는 과정에서 문제가 발생했다.  PUT 메서드를 사용 후 결과가 정상적으로 처리가 되었지만 조회를 해보니 수정이 되지 않았다. POST기능은 정상적으로 작동했다.PUT 이후에도 서버는 정상적으로 호출되었다.하지만 조회 시 수정된 데이터가 조회되지 않았다.2. 원인 이러한 문제를 해결하기 위해 디버깅 과정을 거쳤다. 데이터가 누락되는 현상은 없어 보였지만, console창에서 update가 없는 것을 발견했다. Hibernate: /* insert for com.sparta.scheduledev.entity.User */insert into user (created_at, email, login, modified..

트러블 슈팅 2024.10.17

[Spring] Bean을 수동으로 등록하는 방법 및 BCryptPasswordEncoder

일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다. @Component를 사용하면 @ComponemtScan에 의해 자동으로 스캔되어 클래스를 Bean으로 등록해 준다.왜냐하면 프로젝트의 규모가 커질 수 록 등록할 Bean들이 많아지기 때문이다. 그러면 Bean 수동 등록은 언제 사용될까?기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들은 수동으로 등록하는 것이 좋다.수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있다. Bean 수동 등록하는 방법@Configurationpublic class PasswordConfig { @Bean public PasswordEncoder passwordEncoder() { ..

Spring 2024.10.08

[프로그래머스]약수의 개수와 덧셈 (Java)

문제 설명  [내가 짠 코드]class Solution { public int solution(int left, int right) { int answer = 0; // left에서 right까지 반복 for( int i = left; i  이중 for문을 사용해서 문제를 풀었지만 뭔가 깔끔하지 않아서 더 좋은 방법이 없는지 찾아봤다. [효율성을 높이기 위해 리펙토링]class Solution { public int solution(int left, int right) { int answer = 0; // left에서 right까지 반복 for (int i = left; i Math.sqrt(i) : 루트 값을 구하는 ..

프로그래머스 2024.10.03