java 106

[개발] 🎁배운점 - Optional 클래스에서 getId() 사용하기

if (school.isPresent() && !user.getFavoriteSchool().contains(school.get())) { School newSchool = new School(); newSchool.setId(school.getId()); // newSchool에 다른 필드가 있다면 해당 필드도 설정해주세요. user.getFavoriteSchools().add(newSchool); } 3번째 줄에서 getId() 함수를 사용할 수 없었다. 그런데 나는 반드시 Id 값을 얻어와야 하는 상황이어서 꼭 해결을 해야 했다. school은 Optional 타입이기 때문에 .get()메서드를 호출하여 School 객체를 얻은 후에 getId()를 호출할 수 있다. 따라서, school.get()..

[개발]🚨ERROR - cannot find symbol(클래스) 에러

🛤️현상 여러 블로그들을 검색해서 각종 방법들을 시도/체크 해보았다. 해당 클래스가 존재하지 않는가? ➡️ NO❌ 해당 클래스를 사용할 때 철자를 틀리게 적었는가? ➡️ NO❌ Build > Rebuild Project 를 시도해보지 않았는가 ? ➡️ NO❌ File > Invalidate Caches... 를 시도해보지 않았는가 ? ➡️ NO❌ 클래스 패스를 정확하게 import 해보지 않았는가 ? ➡️ NO❌ ➡️한마디로 블로그에서 본 방법을 사용해도 해결되지 않았다는 것이다!! (이 문제 때문에 거의 하루동안 다른 개발을 진행할 수 없었다ㅠㅠ) 🗝️해결 프로젝트에서 HeartDTO를 찾지 못해서 발생한 일 같다. 그래서 자포자기하는 심정으로 HeartDTO ➡️ DTO로 클래스 이름을 바꾸니까 He..

[개발]🎁배운점 - @JoinColumn이 없다면??

🛤️현상 나는 userid 필드만 entity 클래스에 선언했지 userid_id는 만든 적도 사용한 적도 없는데 갑자기 DB에서 띠용~하고 나타난 것이다!!! 🤔 🌸과정 분명히 이렇게 된 데에는 이유가 있을 텐데... DB에 저런 식으로 속성이 생성됐다는 것은 entity 클래스에 원인이 있다고 유추할 수 있다. 그래서 검색해보 외래키를 사용하는 칼럼에 @JoinColumn를 사용하지 않아서 발생한 일일 수 있다고 했다. 🗝️해결 참고로 name을 지정할 때는 모두 소문자로 적어주는 것이 좋다고 한다. 일반적으로 데이터베이스에서는 소문자로 구성된 칼럼 이름을 사용하는 것이 일관성을 유지하고 가독성을 높이는 데 도움이 됩니다. 따라서 JPA에서도 칼럼 이름을 소문자로 작성하는 것이 권장되는 관례입니다.

[개발]🚨ERROR - javax.persistence.NonUniqueResultException:

🛤️현상 JPA를 통해서 save 메서드를 수행하는데 이런 오류가 발생했다. list를 가지고 오는 것도 아닌데 유니크하고 말고 가 뭐가 중요한 건지 이해가 안 갔다. 🌸과정 "query did not return a unique result: 7"라는 오류 메시지에서 "7"은 예상했던 유일한 결과가 아닌, 중복된 결과가 반환되었음을 나타냅니다. 여러 번 시도를 할 때마다 뒤에 숫자가 7,11,8 등등으로 저 부분은 숫자가 바뀌는 것을 보아 코드상에 문제가 아니라 DB에 들어간 레코드들이 중복돼서 발생한 것 같다는 느낌이 들었는데 레코드를 확인해 본 테이블이 review, school 테이블이었다. 내용을 삭제해도 달라지는 건 없었다.ㅠㅠ 🗝️해결 user 테이블을 확인해보니 핑크색 id 값을 빼고 나머..

[개발]🎁배운점 - ifPresent() 메서드

Optional entity = repository.findById(id); 이러한 코드의 다음 줄에 entity.setContent를 사용하고자 했는데 setter가 사용이 안 되는 것이었다!! 분명히 Review 엔티티에 setter가 있는데도 사용이 안 되니 굉장히 난감했다. 알고보니... Optional을 사용한 경우에 바로 setter의 사용이 불가능하고 entity.ifPresent(review -> { review.setDeleted(true); }); 이런 식으로 isPresent 메소드 + 람다식을 사용해야 비로소 setter를 사용할 수 있는 것이다~~ ifPresent 메서드는 Optional 객체에 값이 존재하는 경우에만 지정한 동작을 수행할 수 있습니다. 이를 통해 값의 유무를 확..

[개발]🤦🏻‍♀️고민하기 - review 기능에 커스텀 DTO 적용

@PostMapping() public ResponseEntity save(@RequestBody ReviewDTO reviewdto) { School school = schoolService.findBySchoolId(1L) .orElseThrow(() -> new IllegalArgumentException("학교가 존재하지 않습니다.")); Review review = ReviewDTO.toEntity(reviewdto, school); return ResponseEntity.ok().body(reviewService.save(review)); } //해당 학교애 대한 전체 리뷰 보여주기 @GetMapping() public ResponseEntity getReviewsBySchoolId(@Requ..

[개발]🎁배운점 - @JsonIgnore

@JsonIgnore에 대해서 단순히 블로그 글이 아니라 내가 직접 몸소 필요성을 느끼고 그에 대한 해결책으로 이 어노테이션을 알게되어서 너무나 기쁘고 신기했다😂 🛤️현상 review 엔티티에 필요한 schoolId라는 속성이 school 테이블에 조인되어 있기 때문에 위와같이 id 값이 1번에 해당하는 불필요한 학교의 정보가 다 딸려나오게 되었다. school 테이블의 필드가 워낙 많다보니 생각보다 불편함을 느낄만한 상황이었다. 🗝️해결

[개발]🤦🏻‍♀️고민하기 - Review_논리적 삭제(logical delete) 도입

완전한 삭제가 아니라 반 삭제처럼 데이터를 일시적으로 비활성화하는 것을 "소프트 삭제(soft delete)" 또는 "논리적 삭제(logical delete)"라고 합니다. 소프트 삭제는 데이터를 데이터베이스에서 완전히 삭제하지 않고, 대신 삭제된 표시를 나타내는 특정 칼럼(예: "isDeleted")의 값을 변경하여 해당 데이터를 비활성화시킵니다. 이렇게 삭제된 표시를 가진 데이터는 일반적으로 조회 및 수정 작업에서 필터링되어 처리됩니다. 소프트 삭제는 데이터 복구 가능성이 있고, 삭제된 데이터의 이력을 추적할 수 있는 장점이 있습니다. 또한, 완전한 삭제보다 더 안전한 방법으로 데이터를 관리할 수 있습니다. 스프링 웹 프로젝트에서 소프트 삭제를 구현하기 위해서는 데이터베이스 스키마에 삭제 여부를 나타..

[개발]🚨ERROR - 객체vs기본 자료형의 불일치

🛤️현상 public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //이 오브젝트의 아이디 private String title; private String content; private Long category; @ManyToOne @JoinColumn(name = "userId") @JsonIgnore private User user; . . . } 이런 식으로 Board entity가 있는데 여기서 주목해야 할 부분은 user 필드이다. 이 필드의 자료형은 User라는 entity 클래스이다. 자료형을 객체로 지정하면 JPA가 알아서 그 객체의 pk를 가지고 온다고 한다. 그래서 user ..