목록분류 전체보기 (351)
Welcome! Everything is fine.

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과..

삭제 기능 테스트 도중, 올바른 비밀번호를 입력해도 404 에러가 뜨는 문제가 있었다. 404 에러를 던지도록 설정한 부분은 DB에 있는 비밀번호와 입력한 비밀번호가 틀리는 경우 발생한다. 이것저것 시도해보다 Repository Layer에서 정확한 scheduleId와 password가 출력되는 것을 확인한 후, 비밀번호를 검증하는 Service Layer에서 다음과 같이 출력해봤다.System.out.println("db password = " + current.getPassword());System.out.println("input password = " + password);System.out.println("equals = " + current.getPassword().equals(passwor..

예외 처리를 구현하는 도중, 원하는 곳에서 예외가 발생하지 않고 엉뚱한 곳에서 발생해서 그 원인을 찾아보았다. 일정을 수정하는 부분 중 findScheduleByIdWithPassword()에서 내가 설정한 ScheduleNotFoundException이 아니라 EmptyResultDataAccessException이 났다.@Transactional@Overridepublic ScheduleResponseDto updateSchedule(Long scheduleId, ScheduleRequestDto dto) { Schedule current = scheduleRepository.findScheduleByIdWithPassword(scheduleId); if (current == null) ..

인프런 강의 을 보고 정리한 내용입니다.매주 모여 각자 정리한 내용을 기반으로 발표하고 질문 공유하는 스터디입니다. 📘HashSet해시 코드 해시 자료 구조에 데이터를 저장하는 경우 hashCode() 를 구현해야 한다! 해시 인덱스는 배열의 인덱스로 사용되기 때문에 양의 정수만 사용 가능하다. 따라서 문자 혹은 객체의 경우 hashCode() 메서드를 통해 고유한 숫자를 만들고, 그 숫자를 이용해 해시 인덱스를 만든다. 문자열의 경우, hashCode() 메서드를 통해 문자를 기반으로 고유한 숫자를 만든다. 강의에서는 'A' - 65, 'B' - 66, 'AB' - 131와 같이 아스키 코드를 통해 각 문자에 고유한 숫자를 할당해 계산했다. 실제 자바의 String.hashCode()는 다음과 같이..