목록2025/02 (10)
Welcome! Everything is fine.

Main 실행 시 에러 발생처음 프로젝트를 받아 실행하니 다음과 같은 에러가 나왔다. 에러 메세지가 길긴 하지만 잘 읽어보면 JWT 시크릿 키에 대한 문제인 것을 짐작할 수 있다. application.properties 파일에 키를 넣으려고 했는데, 아예 resourse 폴더가 없었다. 따라서 먼저 키를 만들어야 했다.java.lang.IllegalArgumentException: Could not resolve placeholder 'jwt.secret.key' in value "${jwt.secret.key}"org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jwtUtil': Injection..

다음 getTodos() 메서드에서 발생하고 있는 N+1 문제를 @EntityGraph를 사용해 해결해야 한다.public Page getTodos(int page, int size) { Pageable pageable = PageRequest.of(page - 1, size); Page todos = todoRepository.findAllByOrderByModifiedAtDesc(pageable); return todos.map(todo -> new TodoResponse( todo.getId(), todo.getTitle(), todo.getContents(), todo.getWeather(), ..
튜터님의 해설 강의를 듣고 일정 관리 앱 과제를 리뷰하다가 알게 된 내용을 간단하게 포스팅 해본다. 이번 일정 관리 앱 과제에서 튜터님의 코드와 비교했을때, 가장 큰 차이 중 하나는 세션을 사용하는 방식이었다. 나는 HttpSession을 직접 가져와 사용하는 방식을 사용했다. 반면 튜터님은 @SessionAttribute 어노테이션을 사용하여 세션 속성을 자동 주입하는 방식을 사용하셨고, 그 방법이 더 쉽게 세션을 사용할 수 있는 것 같다.📌 세션을 사용하는 방식HttpSession 사용하기내가 작성한 댓글 생성 기능 부분이다. HttpServletRequest에서 HttpSession을 가져와 세션키를 사용하고 있다. 이 방법은 Servlet API에서 제공하는 기본적인 세션 관리 방식으로, 직접 ..

Converter 사용하기Spring은 기본적인 컨버터를 제공하지만, 컨버터를 커스텀하게 구현할 수도 있다. 예를 들면, String 값을 특정 객체를 변환하고 싶다면 커스텀 컨버터를 구현해야 한다. 강의 실습을 따라 String 값을 Person 객체로 변환하는 컨버터를 구현해보자. Person 객체는 name과 age 필드를 갖는다. Controller에서 URL 파라미터를 Person 객체로 반환해야 한다면 커스텀 컨버터를 구현 후, WebMvcConfigurer 에서 등록해야 한다.@GetMapping("/type-converter")public void typeConverter(@RequestParam Person person) { log.info("person.getName() = {}"..
문제점develop 브랜치에서 git pull origin develop을 하려는데 에러가 발생했다.에러 메세지를 읽어보니 내 브랜치에서 아직 커밋되지 않은 변경 사항이 존재하기 때문에 발생한 것이었다.하지만 현재 내 로컬 브랜치에서의 작업이 아직 끝나지 않아서 commit하고 싶지 않았다.해결 방법변경 사항을 유지하면서 git pull 하는 방법으로 진행했다. 1) 변경 사항 임시 저장git stash push -m "임시 저장" 2) 원격 저장소에서 최신 코드 가져오기git switch developgit pull origin develop 로컬 develop 브랜치에 원격 develop 코드를 가져올 것이기 때문에 develop 브랜치로 이동 후 진행했다. 3) 다시 내 브랜치로 이동 후 변경 사항..
강의를 참고하여 비밀번호 수정 기능을 구현하던 중, 왜 단순히 Setter를 사용하지 않고 updatePassword() 메서드를 따로 만들어야 하는지 의문이 들었다. public void updatePassword(String password) { this.password = password;} Member 엔티티에서 아래와 같이 @Setter를 password 필드 위에 추가하면 안되는 것일까?@Setter@Column(nullable = false)private String password; 찾아보니 Setter의 사용을 지양하는 이유는 여러가지가 있었다. 1️⃣ Setter를 사용하면 객체의 일관성을 유지하기 어렵다.어디서든 값이 변경될 수 있어 데이터 무결성이 깨질 위험이 있다.2️⃣ Se..

INSERT 됐지만 테이블이 안보이는 문제댓글 작성 시, 아래와 같이 INSERT문은 제대로 실행된 것 같은데 DB에서는 comment 테이블이 보이지 않는 문제가 있었다. @Transactional을 추가하지 않은 것이 원인이다. 트랜잭션이 자동으로 커밋되지 않아서 데이터가 DB에 반영되지 않았던 것이다. Service 계층에서 DB 작업을 수행할 때는 반드시 @Transactional 을 사용해 트랜잭션을 관리해야한다.다음과 같이 @Transactional 을 붙인다.@Transactionalpublic CommentResponseDto save(Long scheduleId, String email, CommentRequestDto dto) { Schedule schedule = schedule..

인프런 강의 을 보고 정리한 내용입니다.매주 모여 각자 정리한 내용을 기반으로 발표하고 질문 공유하는 스터디입니다.📘컬렉션 프레임워크 - Map, Stack, QueueMapMap은 키-값의 쌍을 저장하는 자료 구조로, HashMap이 많이 사용된다!키 중복 불가능 / 값은 중복 가능 / 순서 유지X 자바는 Map 인터페이스의 메서드를 구현하는 HashMap, TreeMap, LinkedHashMap 등 다양한 Map 구현체를 제공한다. Map에서 키만 따로 떼어놓고 보면 Set과 똑같기 때문에 Set과 Map의 구현체는 거의 같다. 실제로 HashSet은 내부적으로 HashMap을 사용하여 구현된다. 따라서 각각의 특징도 이전에 배웠던 내용과 거의 흡사해 간략하게만 정리했다. 다음은 String과..