java 86

[개발] 학교 전체 조회 - 데이터 필터링 + 조인하여 값 가지고 오기

🛤️상황 학교 테이블에는 15개의 컬럼이 존재하는데 프론트 측에서 요구한 반환 정보는 school_tb에서 3개, tag_tb에서 1개이다. 그런데 tag_tb에서 하나의 컬럼(name)을 반환하기 때문에 간단해 보일지 모르지만 schoolId가 같은 모든 name을 반환해야 하기 때문에 List의 형태로 반환해야한다. 개념적으로는 school_tb와 tag_tb가 조인된 관계를 맺고있지만 실제로 entity 클래스끼리 조인관계를 맺고있지 않기 때문에 sql을 작성하고, 그것을 하나의 객체에 담는 것이 굉장히 오래걸렸다.

[개발] spring boot - JPQL(@Query)를 사용하여 데이터 거르기

🛤️상황 tag 테이블에는 아래와 같이 4개의 칼럼이 있는데 프런트로 넘겨줄 때는 이 중 name, code만 필요. 기본으로 제공하는 JPA 메소드 안에서 해결하려고 했지만 따로 SQL문을 작성해야 했음. 🗝️과정/해결 아래의 코드 하나만으로 tag, dept의 정보를 모두 각각의 테이블에서 조회돼서 다른 school 테이블의 필드들과 함께 sch에 저장이 되었다. Optional sch = schoolRepository.findById(id); 하지만 저렇게 자동으로 조회가 되면 tag 테이블에 있는 모든 필드들을 가지고 오게 되니까 안됨. 아래의 필드들을 지워버리니 자동으로 조회되지 않고, 위에서 작성한 @Query을 통해서 원하는 값들만 DTO에 담아 반환할 수 있었다. (dept=학과도 동일한 ..

[개발] intellij - h2 DB에서 MySQL로 변경하기

🛤️상황 처음에 이 프로젝트(한이음)를 시작할 때 가볍게 h2 DB를 사용하다가 추후에 MySql로 변경하기로 했다. 지금 시점에서 곧 서버에 올려 배포를 해볼 예정이라 오늘 변경하기로 하였다. 이미 내 컴퓨터에는 mysql이 설치된 상태 프로젝트도 h2로 잘 구동되고 있는 상태 connector는 내가 따로 프로젝트에 import 한 기억은 없지만 프로젝트 생성 시에 다른 백엔드 팀원이 import 한 것으로 추정됨. (connector 없이 구동되지는 않을 테니까) 🌸과정/해결 application.properties 파일에 설정 정보를 확실하게 기입하기 build.gradle에 필요한 의존성 확실히 기입

[개발] 기능추가 - school 데이터의 추가(dept, tag 테이블)

🛤️상황 기존에 학교에 대한 정보에 해당 학교에 대한 학과나 태그에 대한 정보는 반환하지 않았다. 하지만 반드시 필요한 정보들이기 때문에 그 부분을 내가 개발하기로 하였다. 학과나 태그는 하나의 학교에 여러 가지 값들을 갖는 테이블이기 때문에 school 테이블의 입장에서 학과와 tag는 @OneToMany 관계이다. 🗝️과정/해결 @OneToMany(mappedBy = "schoolId", cascade = CascadeType.ALL) private List tag; tag는 여러 값들이 하나의 school에 존재하니 List 형태로 저장하기로 했다. school 테이블의 깔끔함(?)을 위해서 db에 직접 저장되는 방식이 아닌 것으로 선택했다. (학과(dept)도 동일한 방식으로 진행) @ManyTo..

[개발]🚨ERROR -java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row:

외래 키 제약 조건을 위반하여 자식 행을 추가하거나 업데이트할 수 없을 때 발생하는 예외로 데이터베이스에서 외래 키 관계를 갖는 테이블 간의 일관성을 유지하기 위해 발생합니다. 일반적인 해결방법 외래 키 또는 유니크 제약 조건을 확인하고, 데이터베이스 스키마를 수정하여 제약 조건을 준수하도록 조정 작업 전에 데이터베이스 상태를 검사하여 제약 조건을 위배하지 않는지 확인 참조하는 테이블에 레코드를 먼저 추가한 후, 참조받는 테이블에 레코드를 추가 내가 해결한 방법 참조하는 테이블의 레코드를 먼저 삽입한 뒤에 참조받는 테이블의 레코드를 삽입해봤지만 여전히 실패... 그래서.... DB에 있는 테이블을 한번에 동시에 삭제한다. 참조하는 테이블의 레코드를 먼저 insert 한다. 그 뒤에 참조받는 레코드를 in..

[개발]🚨ERROR - java.lang.IllegalArgumentException: rawPassword cannot be null

🛤️상황 회원가입/로그인이 기존에 GET방식이었어서 POST 방식으로 바꾸려 하는데 이러한 오류가 발생하였다. 🌸과정 401 Unauthorized는 클라이언트 요청이 필요한 인증 자격증명을 제공하지 않았거나 인증이 실패한 경우에 사용되는 HTTP 상태 코드입니다. 즉, 클라이언트는 요청한 리소스에 접근하기 위해 유효한 자격증명(사용자 이름과 비밀번호 또는 인증 토큰 등)을 제공해야 하지만, 제공하지 못하거나 인증에 실패한 상태입니다. 라는 이유로 BCryptPasswordEncoder도 수정해 보고, springSecurity 쪽도 이것저것 시도(코드추가, 클래스 추가) 하느라 3시간이 흘렀다... 🗝️해결 @RequestBody를 매개변수에 붙이니 바로 해결되었다.... 이러한 기초적인(?) 실수를 ..

[개발] [spring boot] 좋아요 기능 개수 제한하기_성공

🤔전 상황 / 원인분석 전전 글에서 좋아요 개수 제한하기에 성공했다고 했었는데 계속 다양한 경우의 수로 테스트를 해보니 중간에 제대로 List에 add가 안 되거나, 개수가 자기 마음대로 나오는 등 그 코드는 실패한 코드였다. 애초에 DB에 저장하는 게 아니라 그냥 로컬(?)에만 담겨있는 favoriteSchool 변수에 무결성을 유지하면서 잘 작동할 수 있는지도 미지수긴 하다. 🌸해결과정 생각해 보니 반드시 저 정보들은 DB에 있어야 언제든지 변경과 불러오기가 가능할 거 같았다. 개수를 제한하는 것도 그냥 테이블에 있는 유저 id를 조회해서 하나의 유저가 10 이상의 레코드를 가지지 못하게 개수를 세면 될 거 같았다. 🗝️해결 @PostMapping public ResponseDTO addHeart(H..

[개발] 🎁배운점 - 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()..