분류 전체보기 55

SQL Injection

SQL Injection공격자가 악의적인 SQL문을 입력하여 데이터베이스가 비정상적으로 동작하도록 하는 공격이 공격을 통해 데이터를 유출하거나, 데이터를 조작할 수 있다.언제?사용자가 입력한 데이터를 SQL쿼리에 직접 삽일할 때사용자의 이름과 비밀번호를 확인하는 쿼리에서 입력 값이 제대로 검증되지 않은 경우사용자의 입력에 대한 검증이 부족한 경우로, 문자열의 길이나 형식에 대한 검증이 없으면 발생할 수 있다.예를 들어공격자가 로그인 폼에 다음과 같이 입력한다면?admin' OR '1'='1'; -- 이 입력은 아래와 같은 쿼리가 된다.SELECT * FROM users WHERE userId = 'admin' OR '1'='1'; -- AND password = '';​1=1 조건은 항상 참으로, 사용자..

Java 2025.01.07

LRU(Least Recently Used)Cache 알고리즘

캐시는 데이터나 값을 미리 복사해 놓는 임시 저장소이다.데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약해야 할 경우 사용한다.캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 없이 더 빠른 속도로 데이터에 접근이 가능하다. LRU (Least Recently Used)가장 최근에 사용되지 않은 데이터를 제거하는 방식빠른 접근과, 업데이터가 가능하지만 많은 공간을 차지한다는 단점이 있다.새로운 데이터가 캐시에 저장될 때, 캐시에 있는 데이터에 접근할 때마다 해당 데이터를 가장 최근에 사용된 데이터로 표시하고 가장 오래 전에 사용된 데이터를 제거한다. 따라서 가장 최근에 사용된 데이터를 캐시에 보관한다.이중 연결 리스트나 해시 맵과 같은 자료 구조를 사용하여 구현할 수 있다. 구..

Algorithm 2025.01.07

HashMap의 구조

키-값의 쌍으로 데이터를 저장하는 자료구조각 키를 해시 함수로 변환하여 배열의 인덱스에 저장하여 데이터 추가, 검색, 삭제 등의 작업을 수행한다. 키의 중복을 허용하지 않으며, 하나의 키에 하나의 값이 매핑된다. 해시 함수는 키를 해시 코드로 변환하여 HashMap의 버킷 인덱스를 정하는데, 서로 다른 두 개의 키가 같은 해시 값을 갖는 경우가 발생한다. 이 현상을 해시 충돌이라고 한다.HashMap에서는 해시 충돌을 방지하기 위해 Chaining, Open Addressing을 이용한다. Chaining충돌이 발생한 버킷 안에서 연결리스트, 트리 구조로 여러 키-값을 저장하는 방식Open addressing다른 빈 버킷을 찾아 데이터를 저장하는 방식자바의 HashMap은 hashCode() 메서드를 이..

Java 2025.01.07

Statement와 PreparedStatement

Statement와 PreparedStatementStatement와 PreparedStatement는 둘 다 JDBC API 에서 제공하는 인터페이스이다.데이터베이스에서 쿼리를 실행할 때 쿼리를 효율적으로 실행하기 위해서 쿼리 캐싱을 시행한다. 쿼리 캐싱쿼리를 파싱하고최적의 실행계획을 세운 뒤실행하는 과정 Statement는 쿼리를 실행할 때마다 매번 쿼리를 파싱하고 실행계획을 세우는 과정을 반복한다.PreparedStatement는 한 번 쿼리가 실행된 후에는 실행계획을 따로 세우지 않고 이전의 실행계획에 파라미터만 변경하여 쿼리를 날린다.따라서 처음 실행된 실행계획을 재사용하기 때문에 성능 측면에서 좋다. 보안 측면에서는 Statement는 입력값을 실제 쿼리에 문자열의 형태로 이어 붙이다. 만약 ..

Java 2025.01.07

try-catch와 try-with-resources

try-catch-finallytry-catch-finally 문은 자바7 이전에 나온 예외 처리 구문으로 모든 객체를 포함할 수 있다. 사횽 후 반납을 해주어야 하는 자원은 Closeable 인터페이스를 구현하는데, 사용 후 close 메서드를 직접 호출하여 반납해야 한다. 자원 반납이 이루어지지 않는 경우, 메모리 누수가 발생할 수 있고 다른 프로세스, 스레드에 영향을 줄 수 있다.따라서 finally 블록 내에서 자원 해제를 꼭!! 해주어야 한다.try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); // 생략} catch (IOException e) { System.err.println("IOExcepti..

Java 2025.01.07

static

static 변수나 메서드를 정의할 때 사용되며, 프로그램의 시작과 동시에 메모리에 로드되어, 모든 인스턴스가 공유할 수 있다.   static 변수모든 객체마다 존재하는 인스턴스 변수와 다르게 클래스 당 한 개만 존재한다.인스턴스 변수는 객체마다 개별적인 값을 갖지만 static 변수는 모든 객체가 동일한 값을 공유한다.클래스에 종속되어 있으며 객체의 생성과는 무관하게 클래스가 로드될 때 딱 한 번 메모리에 할당된다.동일한 데이터를 여러 인스턴스에 저장할 필요가 없기 때문에 메모리 사용의 중복을 줄일 수 있다.JVM의 클래스 영역(Method Area, Metaspace)에 저장된다.Static 변수는 클래스가 처음 로드될 때 한 번만 초기화되며, 프로그램 종료 시까지 유지되기 때문에 메모리 할당과 ..

Java 2025.01.07

ArrayList와 LinkedList

Array동일한 타입의 데이터들이 순차적으로 메모리에 저장되는 자료구조인덱스를 통한 직접 접근이 가능하여, 탐색 속도가 빠르지마, 크기가 고정되어 있고 동적으로 변경할 수 없다.변경이 필요한 경우 배열을 새로 생성한 후 기존의 요소들을 복사하여야 한다.ArrayList동적 배열 기반의 리스트 자료구조내부적으로 배열을 사용하여 요소를 저장하며, 요소의 추가나 삭제에 의해 크기를 동적으로 조정할 수 있다.ArrayList는 생성할 때 초기 용량을 설정할 수 있는데 기본값으로 10으로 설정된다.내부 배열의 용량이 초과되면 ArrayList는 자동으로 배열의 크기를 증가시킨는데, 이 과정에서 더 큰 새로운 배열을 생성하고, 기존 배열의 요소를 새로운 배열로 복사한다. (새로운 배열의 크기는 기존 배열 크기의 1..

Java 2025.01.07

상속과 다형성

객체 지향은 현실 세계를 모델링하여 데이터와 그 데이터를 처리하는 동작을 하나의 객체로 묶고, 이런 객체들 간의 상호작용을 통해 시스템을 설계하고 구현하는 프로그래밍 패러다임이다.  이러한 객체 지향의 특징에는 4가지가 있다.  1. 캡슐화2. 상속3. 다형성4. 추상화  그 중 상속과 다형성에 대해 알아보자. 상속상위 클래스의 기능을 하위클래스로 확장하거나 재사용하는 것이다.하위 클래스는 상위 클래스의 속성과 메서드를 확장하거나 변경하여 사용할 수 있고, 필요에 따라 상속받은 메서드나 속성을 확장하거나 재정의가 가능하다. 공통 기능은 부모 클래스에, 특수 기능은 자식 클래스에서 구현하여 코드의 중복을 줄일 수 있으며,공통 기능이 부모클래스에 집중되어 수정이 쉽다. 다형성하나의 이름으로 다양한 동작을 수..

Java 2025.01.07

CreatedDate, LastModifiedDate 이슈

문제사용자 회원가입시 createdDate, ModifiedDate 값이 제대로 들어가지 않는 이슈가 있었다.원인@CreatedDate와 @LastModifiedDate를 사용하였는데,위의 어노테이션을 사용할 때는@EnableJpaAuditing, @EntityListeners 이 두 어노테이션을 이용해 기능을 활성화 해야 하는데 이 부분을 빠트렸다.해결Application 실행 부분에 @EnableJpaAuditing을 추가하여 Auditing 기능을 활성화 한다.@EnableJpaAuditing@SpringBootApplicationpublic class Shop31cmApplication { public static void main(String[] args) { SpringApplication...

Project 2025.01.07