전체 글 49

MySQL FULLTEXT 인덱스 한글 검색 & ngram 적용 및 트러블 슈

검색 기능 향상을 위해서 인덱스 기능을 추가해보려고 했다. 일반 인덱스검색 기능 향상을 위해서 인덱스 기능을 추가해보려고 했다. 일반 인덱스에서는 %LIKE% 형식을 사용하지 못해서 FULLTEXT 방식을 사용하기로 결정했다. 그래서 인덱스 테이블을 만들고 ALTER TABLE books ADD FULLTEXT INDEX idx_ft_all_fields (title, author, publisher); 쿼리를 작성 SELECT * FROM booksWHERE MATCH(title, author, publisher) AGAINST ('제목' IN BOOLEAN MODE); 그러나 검색어가 정확히 '제목' 이어야만 검색 결과 나온다는 것을 알게 되었다. 그래서 왜 그런지 찾아보니 MySQL의 기본 FULL..

부트캠프 2025.07.14

AOP의 JoinPoint

AOP의 JoinPoint오늘은 Spring AOP에서 JoinPoint를 실제로 사용해보았다.그동안 책이나 공식 문서에서 많이 봤었는데, 코드에 @After, @Before 붙이고 JoinPoint를 파라미터로 받아서 쓰니까 좀 더 감이 왔다.과제에서 써본 예시 (로그 저장)이번에 작업한 기능은,새 매니저가 등록될 때마다 그 기록을 남기는 거였는데,딱 아래 코드처럼 Advice에 JoinPoint를 넣어서실제 실행되는 메소드의 파라미터(여기선 AuthUser)를 잡아내는 방식으로 처리했다.java복사편집 @After("execution(* org.example.expert.domain.manager.service.ManagerService.saveManager(..))")public void logMa..

부트캠프 2025.07.04

QueryDSL

1. QueryDSL이란?QueryDSL은 타입 안전(type-safe)한 쿼리를 Java 코드로 작성할 수 있게 해주는 오픈소스 프레임워크입니다.주로 JPA와 함께 사용되며, JPQL, Criteria API의 한계를 보완합니다.공식 문서:https://querydsl.com/static/querydsl/5.0.0/reference/html_single/2. 왜 QueryDSL을 써야 할까?(언제 QueryDSL을 도입하면 좋은가)2-1. 복잡한 동적 쿼리가 필요할 때JPA의 JPQL, Criteria API로 복잡한 동적 쿼리(조건에 따라 where절이 붙었다 빠졌다 하는 쿼리 등)를 작성하면 코드가 난잡해지고 유지보수가 어렵습니다.QueryDSL은 다음과 같은 장점이 있습니다:가독성: 자바 코드처럼..

부트캠프 2025.06.25

테이블 객체끼리 관계 만들기

엔티티 간의 관계(일대일, 일대다, 다대다)를 정의하고 매핑하는 방식과,연관 관계 매핑을 통해 복잡한 데이터 구조를 효과적으로 관리하는 방법을 알아보자! @OneToOne (일대일 관계)두 테이블이 1:1로 매핑되는 관계를 의미합니다.실제로는 물리적으로 테이블이 분리될 필요가 있는 경우에만 사용합니다.대개의 경우 하나의 테이블에 모두 넣어도 무방한 구조라면 굳이 분리하지 않습니다.의도적 분리/중복 예시:ex) 구독상품 구매시 1:1로 연결된 채팅방 생성 (구독상품:채팅방=1:1)실무에서 자주 사용하진 않으나, 특정한 요구(정보보안, 구분, 데이터 분리 등)가 있을 때 적용합니다. @OneToMany (일대다 관계)한 개의 엔티티가 여러 엔티티와 연결될 때 사용 (예: 한 사용자 → 여러 주문)단방향(@O..

부트캠프 2025.06.24

Spring Boot, H2, 그리고 JDBC

📚 Spring Boot, H2, 그리고 JDBC오늘은 데이터베이스와 Spring Boot를 연동하면서, H2 데이터베이스의 사용 방식부터 트랜잭션, 그리고 JDBC까지 핵심 내용을 정리해보았다.1. H2 데이터베이스 사용 방식 3가지Spring Boot에서 많이 사용하는 H2 데이터베이스는 테스트나 로컬 개발 환경에서 유용하다. H2는 아래 3가지 방식으로 사용할 수 있다.1) Server Mode설명: 실제 서버처럼 동작한다. 여러 애플리케이션이나 사용자가 동시에 접속할 수 있다.활용 예시: 여러 개발자가 하나의 DB를 함께 사용할 때.연결 예시:jdbc:h2:tcp://localhost/~/test2) In-Memory Mode설명: 메모리에서만 동작하는 방식. 애플리케이션이 종료되면 데이터도 사..

부트캠프 2025.06.23

AOP(관점 지향 프로그래밍)

AOP(관점 지향 프로그래밍), 쉽게 배우기프로그래밍하다 보면 여러 메서드에 반복적으로 들어가는 코드가 많아요.예를 들어로그 남기기실행 시간 측정권한 체크이런 건 진짜 자주 나오죠.AOP(Aspect Oriented Programming)는이런 “공통적으로 필요한 기능”만 따로 빼서, 코드 전체에 한 번에 적용할 수 있게 도와주는 기술이에요.1. 스프링 AOP 기본 예시1) Aspect 클래스 만들기import org.aspectj.lang.annotation.*; import org.aspectj.lang.JoinPoint; import org.springframework.stereotype.Component; @Aspect // AOP에서 관점(Aspect)임을 표시 @Component // 스프링 ..

부트캠프 2025.06.12

JPQL 정리

🧠 1. JPQL이란?JPQL(Jakarta Persistence Query Language)은 엔티티 객체 중심 쿼리 언어로, SQL과 거의 동일하지만 테이블이 아닌 엔티티를 기반으로 작성됨 jakarta.ee+2en.wikipedia.org+2thorben-janssen.com+2.예시:— Author 엔티티를 객체 지향적으로 조회 thorben-janssen.com SELECT a FROM Author a ORDER BY a.firstName, a.lastName🔄 2. 동적 쿼리 (Dynamic Query)JPQL은 정적이므로 QueryDSL, Criteria API, SpEL 기반 @Query 등을 통해 런타임 시 동적 조립함 baeldung.com+9medium.com+9thorben-ja..

부트캠프 2025.06.10

StringBuilder

sql 쿼리를 문자열로 만들어서 다른 문자열과 합칠려고할때 무슨 방법이 없을까해서 찾아보게 되었다. StringBuilder 자바에서 문자열을 효율적으로 조작하기 위해서 사용되는 클래스입니다. StringBuilder sql = new StringBuilder("select * from schedule where 1=1"); 이 문자열 뒤에 문자를 추가하려고 할때 사용 사용 방법은 if (name != null) { sql.append(" and author = ?");} .append 를 이용해서 문자열을 추가 하게 되면 "select * from schedule where 1=1 and author = ?" 이러한 문자열이 완성되게 된다. .append말고도 StringBuilder sb =..

부트캠프 2025.05.14

루트 값과 제곱값 구하는 방법

Math.sqrt( ) 와 Math.pow( )에 대해서 알아보자 먼저 Math.sqrt( )로 루트값을 구할 수 있다. Math.sqrt(9); // 3Math.sqrt(25); // 5Math.sqrt(100); // 10Math.sqrt(2); // 1.414213562373095Math.sqrt(-1); // NaN 제곱값 구하는 방법 Math.pow( ) Math.pow(base, exponent) base 에는 제곱하고 싶은 숫자를 exponent 에는 base를 몇번 제곱할지 적으면 된다. // simpleMath.pow(7, 2); // 49Math.pow(7, 3); // 343Math.pow(2, 10); // 1024// fractional expone..

카테고리 없음 2025.05.01

클래스의 필드 선언

개인 과제를 하는 도중에 Cart cart;Food(Cart cart) { this.cart = cart;} 이러한 구조를 짜게 되었는데 ( Food 클래스에 속성과 생성자를 만듬) 클래스의 멤버 변수로 Cart 타입의 cart 변수를 선언하게 된건데 이러한 방식이 가능한지 처음 알게 되었다. 이러한 방식을 Dependency Injection이라고 하는데 객체 간의 의존관계를 외부에서 주입해주는 설계 패턴이라고 한다 ( GPT 피셜 ) 의존성 주입을 사용하지 않은 방식과 사용한 방식 1. 의존성 주입을 안 쓴 경우 :public class Food { Cart cart = new Cart(); // 직접 생성 public void showCart() { System.out..

카테고리 없음 2025.04.30