한이음 47

[개발] Querydsl을 사용하여 학교 좋아요 리스트 반환하기

유저의 토큰을 header에 넣으면 해당 유저가 누른 좋아요 id (heart 테이블) 좋아요 한 학교의 schoolId (heart 테이블) 좋아요 누른 학교의 이름 (school 테이블) 좋아요 누른 학교의 학생수 (user 테이블) 🔜 우리 웹 사이트에 있는 해당 학교의 유저수를 의미함. 🔜 user정보에 재학 중인 schoolId가 있음. 좋아요 누른 학교의 태그 (tag 테이블) 🔜 지난번에 포스팅 했지만 tag테이블과 school 테이블은 조인 관계를 맺고 있지 않다. 매개변수로 userId가 들어온다, 그 heart 테이블에 있는 Id 값과 schoolId 값을 차례대로(쌍으로) 조회한다. 그 schoolId를 가지고 school 테이블에서 schoolName을 조회한다. 그 schoolId..

[개발] Querydsl를 사용하여 원하는 정보 조회/반환하기(Refactoring)

🏕️상황 https://grogrammer.tistory.com/53 [개발] Querydsl, DSL를 사용하여 원하는 정보 조회/반환하기(코드분석) 🏕️상황 //school 리스트를 반환하는 메소드 //school_tb : id와 schoolName, tag_tb : name(태그명), user_tb : schoolId를 counting. 총 3개의 테이블을 조인하여 반환 public List findSchoolInfoWithTagsAndUserCount() { JPAQueryFac grogrammer.tistory.com school의 list를 반환하는 메서드에 반환 값이 까다로워서 코드가 좀 복잡해지고, 기능이 정상적으로 작동하니 일단 깃랩에 업로드하였다. 하지만 for문 안에 sql문이 있었고..

[개발]🤦🏻‍♀️고민하기 - Querydsl 사용 시 클래스 구조(repository, service)

🌦️기존상황간단하게 구조도를 그려봤다.그리고 보니 querydsl을 사용한 메서드를 기준으로 보면 repository와 전혀 관계를 맺고 있지 않다. querydsl을 사용하니 JPA메소드도 사용하지 않기 때문이다.service에다가 querydsl을 적어놓은 이유는 service 단에 늘 함수들을 구성해 놓았기 때문이다!! ⛅과정같은 백엔드 팀원에게 해당 구조에 대해 문제점을 제기받았다. 처음에는 굳이..? 싶었다. 괜히 복잡하게 클래스만 늘어나는 거 같아서 의문스러웠다.그런데 알아보니 나처럼 service단에서 querydsl을 쓰는 경우는 거의 없는 거 같았다.^^ 더 나은 코드를 위해서라면 더 이상 고민할 이유가 없었다.☀️해결schoolRepository가 JPARepository, Schoo..

spring boot - JPQL과 Querydsl의 개념과 차이점 파헤치기🕵🏻

JPQL과 Querydsl의 차이점은 무엇인가? 💚JPQL (Java Persistence Query Language) JPQL은 JPA에서 제공하는 객체 지향 쿼리 언어이다. 문자열 기반의 쿼리를 작성하며, 엔티티와 속성에 대한 문자열 경로를 사용하여 쿼리를 작성 JPQL은 JPA의 표준 인터페이스에 의해 정의되었기 때문에 JPQL 쿼리는 어떤 JPA 구현체를 사용하더라도 동일하게 작동. 즉, JPQL 쿼리를 작성한 후 Hibernate, EclipseLink, OpenJPA 등의 JPA 구현체를 사용하여 실행하면 결과는 동일하게 나온다. JPQL 쿼리를 특정 JPA 구현체에 종속되지 않고 이식성 있게 작성할 수 있다는 장점이 있다. JPQL은 애플리케이션의 엔티티 클래스와 관련하여 작동하며, 쿼리 실..

[개발] spring boot - db 접속 정보 암호화, application.properties 암호화

🛤️상황 application.properties에 있는 DB접속 정보가 아래의 코드처럼 그대로 담긴 코드가 깃랩에 올라가 있는 상태였다. 서버에 배포하기 시작하면 이것도 관리 대상이기 때문에 이 정보들을 암호화하는 작업이 필요했다. spring.datasource.url="접속 경로" spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username="각자의 유저네임" spring.datasource.password="각자의 패스워드" 🌸해결과정 이 정보들을 암호화하는 방식은 알아보니 굉장히 많았다. 그래서 이것저것 시도하다보니 더 오래 걸렸다. 내가 선택한 방식은 복호화하는 코드가 직접적으로는 없는 방식으로 선..

[개발외]멘토링 진행 - 2023/07/10

🏕️상황 어제인 2023/07/10에 학교에서 멘토링을 진행하였다. 오늘 멘토링 내용/주제 : AWS 배포 교수님(멘토)의 지도하에 aws에서 이것저것 설정하고 여러 가지 값들을 선택하는데 모르는 단어들이 쏟아져 내렸다. 일반적인 개발 용어가 아니라 인터넷적인(?) 용어가 대부분인 느낌...!! 예비 개발자 인생 2년이 넘어가는데 처음 해보는 이 중요한 관경을 놓치고 싶지 않아서 열심히 참여했다. (한 대의 컴퓨터로 진행하니 나는 그냥 열심히 모니터 쳐다보기ㅎㅎ) 중간에 바쁜 와중에도 간단하게 메모를 하였다. (워낙 빠르게 지나가서 상세하게는 못하고 대강 했다. ) 🗝️메모한 내용들 사용자가 밤까지 계속해서 있는지, 낮동안에 잠깐 스다가 밤에는 이용자가 줄어주는지에 따라서 적당히 가격등을 따져서 선택한다..

[개발]🚨ERROR - cannot find symbol method value()

🛤️상황 🌸과정 @Value 어노테이션은 스프링 프레임워크의 일부인 spring-context 모듈에 포함되어 있으므로, 해당 모듈의 의존성이 프로젝트에 제대로 추가되어야 한다길래 위의 사진처럼 실제로 그것까지 추가했다... 하지만 달라지는 것은 없었다. ㅠㅠ 🗝️해결 이 lombok.Value가 아니라 spring에서 제공하는 Value를 import 해야 하는 것이었다..!! (어이없는 실수,,ㅎㅎ)

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

🛤️상황 학교 테이블에는 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=학과도 동일한 ..

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

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