개발자 60

[개발] Querydsl, DSL를 사용하여 원하는 정보 조회/반환하기(코드분석)

🏕️상황 //school 리스트를 반환하는 메소드 //school_tb : id와 schoolName, tag_tb : name(태그명), user_tb : schoolId를 counting. 총 3개의 테이블을 조인하여 반환 public List findSchoolInfoWithTagsAndUserCount() { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); QSchool school = QSchool.school; QTag tag = QTag.tag; QUser user = QUser.user; List schoolInfoList = queryFactory .select(Projections.constructor(SchoolI..

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="각자의 패스워드" 🌸해결과정 이 정보들을 암호화하는 방식은 알아보니 굉장히 많았다. 그래서 이것저것 시도하다보니 더 오래 걸렸다. 내가 선택한 방식은 복호화하는 코드가 직접적으로는 없는 방식으로 선..

[개발]🚨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=학과도 동일한 ..

[개발] 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..

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

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

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