728x90

Java 44

Java, 동등성과 동일성 정의 및 활용 예시 (VO 사용 예시)

목차동일성과 동등성 이란두 인스턴스화 된 객체를 서로 같다고 정의하는 기준equals()와 hashCode()의 재정의 이유VO로 알아보는 동일성과 동등성의 중요성VO 사용 예시      두 인스턴스화 객체가 "같다"라는 개념은 "동일성(Identity)"과 "동등성(Equality)"로 나뉜다.  동일성(Identity) 확인 → ==연산자두 객체의 메모리 주소가 같은지 비교같은 인스턴스를 가리키고 있는지 확인완전히 같은 객체인지 체크하는 용도(ex. 싱글톤, 캐시된 객체) 동등성(Equality) 확인 → equals() 메서드 재정의두 객체의 내용(값)이 같은지 비교equals()를 오버라이딩하여 원하는 기준을 정의해야 함VO(Value Object)에서 중요 → 같은 값을 가지면 같은 객체로 인식..

Java 2025.04.02

Java, Immutable 불변 객체란?

immutable 불변 객체 객체 생성 이후 내부 상태가 변하지 않는, 변경할 수 없는 객체 대표적으로 Java의 String, Integer, Long, Double 이 있다. 사용하는 이유동시성 문제 해결멀티스레드 환경에서 가변 객체를 공유하면 예상치 못한 동작이 발생할 수 있다. 하지만 불변 객체는 상태가 변하지 않기 때문에 여러 스레드에서 안전하게 공유할 수 있다. 안정성과 예측 가능성 증가불변 객체는 생성된 후 값이 변하지 않으므로 한 번 설정된 상태를 유지할 수 있다. 이 덕분에 프로그램의 흐름을 더 쉽게 예측할 수 있다. 참조 투명성 유지불변객체는 항상 같은 입력에 대해 같은 출력을 보장한다. 즉, 순수 함수에 적합하므로 함수형 프로그래밍에서도 많이 사용된다. 불필요한 방어적 복사 제거가변 ..

Java 2025.04.02

암호화, 오류 Error attempting to apply AttributeConverter

오류 발생Caused by: jakarta.persistence.PersistenceException: Error attempting to apply AttributeConverter [ 전체 목록 조회 ]사용자 비밀번호를 양방향 암호화로 저장하고 저장된 모든 데이터를 출력하려고 할 때,발생한 오류이다.의미JPA에서 엔티티의 속성을 데이터베이스로 변환할 때 AttributeConverter에서 문제가 발생이 오류는 주로 엔티티 속성에 대한 변환기(@Convert)가 제대로 작동하지 않을 때 발생한다. 문제 원인 잘못된 키 사용 (Bad Key)암호화와 복호화는 같은 키를 사용해야 한다. 만약 암호화할 때 사용한 키와 복호화할 때 사용한 키가 다르면 패딩 오류가 발생할 수 있다.secretKey 값이 암호..

Java 2025.03.25

암호화, AES-256-CBC를 이용해서 암호화/복호화 하는 방법

AES-256-CBC양방향/대칭 키 암호화 방식암호화 및 복호화에 사용되는 키 값이 동일데이터를 256비트 키와 CBC 모드(Cipher Block Chaining)로 암호화AES는 Advanced Encryption Standard 의 약자로, AES-256은 256 비트 키를 사용하는 AES 알고리즘고속의 대칭키 블록 암호화 알고리즘CBC가장 일반적으로 사용되는 작동 모드 블록을 그대로 암호화하지 않고 이전에 암호화했던 블록과 XOR 연산을 수행하는데,첫 번째 블록은 이전에 암호화한 블럭이 없기 때문에 IV를 이용 동작 원리1. 초기화 벡터(IV, Initialization Vector)CBC 모드는 IV라는 추가적인 값을 필요로 한다.암호화 과정의 첫 번째 블록에만 사용되고, 그 후에는 암호화된 이..

Java 2025.03.24

암호화, 양방향 vs 단방향 암호화

암호화 종류양방향 (암호화 + 복호화)대칭키 (비공개키)비대칭키 (공개키)암호화 및 복호화 예시평문: "안녕하세요"암호화: "97aef2af4b16b80f546c8bff375b7a556d29c0ea44592e837a663651d48123bf"복호화: "안녕하세요"  단방향 (암호화)해시 SHA-256 해시 해시를 사용한 비밀번호 저장 시 보안 강화 방법해시만으로는 보안에 취약할 수 있다 때문에 해시를 강화할 수 있는 방법이 추가적으로 필요하다.1. Salt(소금) 추가해시 값을 생성할 때 랜덤한 문자열을 추가하는 방법같은 비밀번호도 매번 다른 Salt 값이 추가해 해시 값을 다르게 생성할 수 있다.password123 + randomSalt -> 해시화 -> 해시값 * 여기서 Salt 값과 비밀번호는 $..

Java 2025.03.24

Java, 채팅하기(Chat)

Chat 챗팅은 스레드가 필요하다.한쪽이 처리하고 그 다음이 처리하는게 아니라(절차식) 왔다 갔다 하며 처리하는 기능이 필요하다. 서버는 한대이지만 chatServer는 절대 스레드가 되면 안되고ChatServer가 중심으로 서버 소켓을 가지고 있다.1. ChatClient가 소켓을 가지고 들어온다2. ChatServer가 낙아챈다3. Socket을 만들고(ChaThandle에) 뭔가가 오면 모든 ChaThandler가 ChatClient에게 다 뿌려준다.** 하지만 소켓은 1:1로 연결되어있다.  클라이언트의 연결 요청을 수락 ServerSocket serverSocket;  100개의 클라이언트가 동시에 채팅할 수 있도록 ExecutorService threadPool = Executors.newFi..

Java 2024.08.16

Java, Iterator (ioStream)

Iterator  Iterator 인터페이스는 Collection 인터페이스를 구현 및 상속한 모든 컬렉션 클래스에서 사용 가능하다.  Iterator it = coll.iterator();while(it.hasNext()) { System.out.println(it.next());} Iterator 관련 메서드 Iterator 인터페이스가 제공하는 메서드는 3가지로 꽤 단순하다. 또한, '반복자'라는 이름답게 while, for 문과 함께 사용된다. 1. hasNext()  다음 요소가 존재하는지 혹은 그렇지 않은지 true/false로 리턴한다. true 이면 다음 요소다 있다는 것이고, false 이면 현재 요소가 마지막이라는 뜻이다. 2. next()다음 요소를 가져온다.3. remove()..

Java 2024.08.12

Java, 함수형 프로그래밍 / 람다식

함수형 프로그래밍이란?  함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법을 말한다. 데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공된 함수에 의존한다. 람다식  자바는 함수형 프로그래밍을 위해 Java 8부터 람다식을 지원한다. 데이터 처리부는 람다식을 받아 매개변수에 데이터를 대입하고 중괄호를 실행시킨다. 자바는 람다식을 익명 구현 객체로 변환한다. 인터페이스의 익명 구현 객체를 람다식으로 표현하려면 반드시 하나의 추상메소드만 가져야 한다. 인터페이스가 단 하나의 추상메소드를 가질 때, 이를 함수형 인터페이스 라고 한다. 인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙이면 된다.   ..

Java 2024.08.05

Java, 스레드, 동기화처리, 싱글톤

프로세스  현재 실행중인 프로그램  멀티프로세스(멀티캐스킹) 하나의 cpu에 여러 개의 응용프로그램을 동시에 실행  시분할 시스템  0.2초의 간격으로 짤라서 실행된다. 공격과 방어가 동시에 일어나야한다.  스래드(Thread)  프로그램을 단위 단위로 짤라놓은 것  1. 단위 프로그램 2. main 메소드도 하나의 스레드이다. 3. 스레드 종료하려면 run()를 벗어나면 된다. 멀티스레드  하나의 프로그램에서 여러 개의 스레드를 동시에 수행하는 것을 의미 cpu가 왔다 갔다 거리면서 두개 이상의 프로그램을 동시에 볼 수 있게 한다. 스레드 생성방법1) Thread 클래스로 상속 2) Runnable 인터페이스 이용  스레드 처리  스레드 생성 --> Thread 변수명 = new Thread();↓ ..

Java 2024.08.05

Java, io Stream(InputStream, OutputStream)

객체 직렬화 객체는 파일이나 네트워크로 전송이 안된다.객체는 절대 보낼 수 없고 문자열만 간다.따라서, 객체를 byte[] 단위로 (쪼개서) 변환시켜서 전송해야 한다.쪼갠 상태에서 받지는 않고 묶어서 받게 된다.가는 동안만에만 쪼개져 가고 도착했을때는 다시 객체로 묶어준다.(자바에서 알아서 수행함)-> Serializable만 선언해주면 된다. io Stream 데이터가 흘러가는 길을 만든다. Application을 중심으로 받는 쪽, 보내는 쪽이 정해진다. 받는 쪽 보내는 쪽 --> 출력 --> 파일 단위 1. byte 단위 처리(숫자, 영문자) - byte 스트림InputStreamOutputStream byte => 8bit / 영문자 1자 => 1byte , 한글 1자 => 2byte한글이 훨씬 ..

Java 2024.08.05
728x90