분류 전체보기 (354) 썸네일형 리스트형 [DB] 데이터베이스에서 사용되는 다양한 키 🔑 1. 기본 키 (Primary Key)테이블에서 각 레코드를 고유하게 식별하는 데 사용된다.또한, 후보 키들 중에서 하나를 선택해서 지정한 유일한 키이다.CREATE TABLE employees ( id INT PRIMARY KEY, -- 기본 키 name VARCHAR(50), salary INT); ✅ 특징유일성: 기본 키의 값은 중복될 수 없음.널 값 불허: 기본 키는 널 값(NULL)을 가질 수 없음.기본 키가 설정된 컬럼은 자동으로 인덱스가 생성된다.2. 유니크 키 (Unique Key)기본 키와 유사하지만, 중복된 값은 허용하지 않지만 NULL 값은 허용된다.CREATE TABLE users ( user_id INT PRIMARY KEY, email VARCHA.. [DB] MySQL InnoDB의 인덱스 생성 전략 📌 1. 기본키 인덱스 (Primary Key Index)기본키(PK)가 설정된 컬럼에 자동으로 생성되는 인덱스이다.InnoDB에서는 기본키가 클러스터형 인덱스(Clustered Index)로 동작한다.데이터가 기본키 기준으로 물리적으로 정렬되며 저장된다.✅ 특징테이블당 하나의 기본키만 설정 가능하다.NULL을 허용하지 않으며, 중복된 값을 가질 수 없음.기본키 검색이 빠르며, 다른 인덱스에서 기본키를 사용해 데이터 검색을 수행함.🚀 예제CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100));위와 같이 id를 기본키로 설정하면, id를 기준으로 클러스터형 인덱스(Clustered Index)가 생성된다.📌 2. 클러스터형 인덱스.. [JPA] ID 생성 전략 ✏️ @GeneratedValueJPA에서 ID를 자동 생성하는 방법에는 4가지 전략이 있다.각 전략은 @GeneratedValue(strategy = GenerationType.XXX)로 지정할 수 있다. 📌 1. AUTO (기본값)@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id; ✅ 특징기본값으로 사용됨 (명시하지 않으면 AUTO가 적용됨).데이터베이스에 따라 적절한 전략을 자동 선택.보통 MySQL은 IDENTITY, H2나 Oracle은 SEQUENCE로 자동 선택됨.🛠 예제: MySQL vs H2데이터베이스AUTO 전략이 선택하는 기본값MySQL, MariaDBIDENTITY (AUTO_INCREMENT 사용)H2, Ora.. [JPA] 💼 PersistentBag 💼 PersistentBagPersistentBag은 Hibernate에서 제공하는 컬렉션 타입 중 하나로, @OneToMany 또는 @ManyToMany 관계에서 사용되는 List 타입의 컬렉션을 관리하기 위한 구현체이다. 이 컬렉션은 지연 로딩(lazy loading)과 변경 감지 기능(dirty checking)을 지원하며, JPA 엔티티에서 List 타입의 필드를 사용할 때 Hibernate가 자동으로 변환하는 컬렉션 타입이다.🤔 PersistentBag이 언제 사용될까?✅ @OneToMany 관계에서 List를 사용할 때@Entitypublic class Member { @Id @GeneratedValue private Long id; private String nam.. [GitHub Actions] GitHub Actions 명령어 GitHub Actions의 YAML 파일에서 자주 사용되는 기본적인 명령어들명령어설명name:GitHub Actions의 워크플로우 이름 설정on:워크플로우 실행 조건 설정 (ex: push, pull_request, schedule 등)jobs:실행할 작업을 정의runs-on:실행 환경 지정 (ex: ubuntu-latest)steps:실행할 단계 정의uses:GitHub Marketplace의 액션을 사용run:직접 명령어 실행 (ex: ./gradlew build)env:환경 변수 설정with:액션에 전달할 인자 설정secrets:GitHub Secrets에서 보안 정보 가져오기 1. Checkout 코드 가져오기(GitHub 리포지토리의 코드를 가져오는 액션)- name: Checkout rep.. [보안] 웹 보안 위협 및 공격 기법 🚨 1. SQL Injection (SQL 삽입 공격) 📌 정의웹 애플리케이션이 사용자 입력을 제대로 검증하지 않고 SQL 쿼리에 포함할 경우, 공격자가 악의적인 SQL을 삽입하여 데이터베이스를 조작하는 공격 방식이다.로그인 우회, 데이터 탈취, 데이터 변경·삭제가 가능함. 💥 공격 예시 (로그인 우회 공격)1. 로그인 폼이 있고, 사용자가 아이디와 비밀번호를 입력해야 한다. 2. 일반적으로 실행되는 SQL 쿼리는 다음과 같다.SELECT * FROM users WHERE username = 'admin' AND password = 'password123'; 3. 공격자는 username 필드에 다음과 같이 입력한다.' OR '1'='1 4. SQL 쿼리가 다음과 같이 변조됨.SELECT * FRO.. [QueryDSL] 스프링 데이터 페이징와 Querydsl 페이징 연동 스프링 데이터 페이징 활용1 - Querydsl 페이징 연동스프링 데이터의 Page, Pageable을 활용해보자.전체 카운트를 한번에 조회하는 단순한 방법데이터 내용과 전체 카운트를 별도로 조회하는 방법사용자 정의 인터페이스에 페이징 2가지 추가public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); Page searchPageSimple(MemberSearchCondition condition, Pageable pageable); Page searchPageComplex(MemberSearchCondition condition, Pageable pageable);} 1. 전체 카운트를 .. [QueryDSL] 스프링 Data JPA와 QueryDSL 스프링 데이터 JPA - MemberRepository 생성 public interface MemberRepository extends JpaRepository { List findByUsername(String username);}Querydsl 전용 기능인 회원 search를 작성할 수 없다. → 사용자 정의 리포지토리 필요사용자 정의 리포지토리 사용법사용자 정의 인터페이스 작성사용자 정의 인터페이스 구현스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속사용자 정의 리포지토리 구성 1. 사용자 정의 인터페이스 작성public interface MemberRepositoryCustom extends MemberRepository{ List search(MemberSearchConditio.. [QueryDSL] 순수 JPA와 QueryDSL 순수 JPA 리포지토리와 QueryDSL순수 JPA 리포지토리@Repositorypublic class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member) { em.persist(member); } public Optional findById(Long id) { .. [QueryDSL] 수정, 삭제 벌크 연산, SQL function 호출 수정, 삭제 벌크 연산 1. 쿼리 한번으로 대량 데이터 수정@Testpublic void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); Assertions.assertThat(count).isEqualTo(2);} 2. 기존 숫자에 1 더하기, 곱하기@Testpublic void bulkAdd() { long count = queryFactory .update(member) .set(member.ag.. 이전 1 2 3 4 ··· 36 다음