의문점 공부하기 102

🧾 자바 직렬화는 왜 쓸까

자바 직렬화: 자바 객체를 바이트 스트림으로 변환하는 과정 바이트 스트림은 파일에 저장하거나 네트워크를 통해 전송할 수 있다. 네트워크 통신: 객체를 네트워크를 통해 전송해야 할 때 직렬화를 사용할 수 있다. 객체를 직렬화하여 바이트 스트림으로 변환하고, 이를 네트워크를 통해 전송할 수 있다. 수신 측에서는 바이트 스트림을 역직렬화하여 원래의 객체로 복원할 수 있다. 분산 시스템: 분산 시스템에서는 여러 컴퓨터 간에 객체를 전송해야 할 때 직렬화를 사용할 수 있다. 객체를 직렬화하여 전송하고, 수신 측에서는 역직렬화하여 객체를 사용할 수 있다 데이터베이스 저장: 객체를 데이터베이스에 저장해야 할 때도 직렬화를 사용할 수 있다. 객체를 직렬화하여 바이트 스트림으로 변환하고, 이를 데이터베이스에 저장할 수 ..

🧾 동적 프록시란 ???

먼저 프록시란? - 클라이언트와 서버 사이에서 중계 역할을 하는 컴퓨터나 응용 프로그램 - 프록시 서버는 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접근할 수 있도록 해주며, 이를 통해 데이터 전송 시간을 절약하고 네트워크 병목 현상을 방지하는 등의 이점을 제공 동적 프록시 - 프로그래밍에서 특정 클래스의 인터페이스를 구현하는 클래스를 런타임에 동적으로 생성하는 기술 - 프록시 패턴의 한 형태로, 대상 객체에 대한 액세스를 제어하거나 추가적인 행동을 추가하는 등의 목적으로 사용 - 동적 프록시를 사용하면 개발자는 매번 프록시 클래스를 직접 작성하지 않아도 된다 - 프록시 객체는 런타임에 동적으로 생성되며, 이렇게 생성된 프록시 객체는 원래 객체를 대신하여 원래 객체에 대한 연산을 수행할 ..

📌 스레드 풀에서 submit()과 execute()의 차이는 ?!?!?

우선 submit()과 execute() 메서드는 스레드 풀에서 작업을 처리하는데 사용되는 메서드 작업 처리 결과 반환: submit() 메서드는 작업 처리 결과를 받을 수 있도록 Future 객체를 반환 submit()을 사용하면 작업의 결과를 추출하거나 작업이 완료되었는지 확인할 수 있다. 예를 들어, 작업이 어떤 값을 계산하고 그 값을 반환한다면, submit() 메서드는 그 값을 Future 객체로 받을 수 있다. 반면, execute() 메서드는 작업 처리 결과를 반환하지 않는다! 예외 처리: execute() 메서드는 작업 처리 중에 예외가 발생하면 해당 스레드가 종료되고 스레드 풀에서 제거된 후, 새로운 스레드가 생성되어 다른 작업을 처리한다. 이로 인해 execute() 메서드는 예외가 발..

📌 스레드 풀을 생성할 수 있는 여러가지 방법은 뭐가 있을까??????

우선 스레드 풀은 미리 생성된 스레드의 집합 !! ExecutorService 사용하기: Java에서는 ExecutorService 인터페이스를 사용하여 스레드풀을 생성하고 관리할 수 있다. ExecutorService를 사용하면 스레드풀의 크기, 작업 큐의 크기 등을 설정할 수 있다. ExecutorService executorService = Executors.newFixedThreadPool(10); ThreadPoolExecutor 클래스 사용하기: ThreadPoolExecutor 클래스를 직접 사용하여 스레드풀을 생성할 수도 있다. 이는 ExecutorService 인터페이스의 구현체인데, 세밀한 설정이 가능 ThreadPoolExecutor의 생성자를 사용하여 스레드풀의 크기, 작업 큐의 크..

📌 thread run()과 thread start()의 차이가 뭘까?

thread run()과 thread start()는 둘 다 스레드(Thread)를 실행하는 메서드..! 그러나 차이점은 존재! thread run() : 스레드를 직접 실행하는 메서드 이 메서드를 호출하면 현재 스레드에서 run() 메서드가 실행된다 스레드가 별도의 실행 흐름을 가지지 않고 현재 스레드에서 실행 thread start(): 스레드를 시작하는 메서드 이 메서드를 호출하면 새로운 스레드가 생성되고, 해당 스레드에서 run() 메서드가 실행 스레드가 별도의 실행 흐름을 가지며, 동시에 여러 스레드가 실행될 수 있다. thread run()은 스레드를 직접 실행하는 반면, thread start()는 새로운 스레드를 생성하여 실행하는 차이가 존재!!!

🧾 GOF의 proxy패턴 사용하는 이유가 뭘까?

일부 메서드의 동작 변경할때 기존 코드는 손대지 않고 기능을 변경 할 수 있기에...! 가상 프록시 (Virtual Proxy): 비용이 많이 드는 객체를 필요할 때 생성하도록 하는 패턴 ex) 데이터베이스 접근은 데이터가 실제로 사용되기 전까지 프록시가 대신하는데, 이는 초기화를 지연시키는 효과를 가지며, 복사/수정에도 유용 리모트 프록시 (Remote Proxy): 원격 컴포넌트의 클라이언트를 네트워크 주소와 IPC 프로토콜로부터 숨기는 패턴 프록시는 요청을 네트워크를 통해 전송하고, 이 요청은 서버 측 객체에 의해 처리된다. 보호 프록시 (Protection Proxy): 특정 메소드로의 접근을 제어하는 패턴 프록시 메소드는 인증 토큰을 전달받고, 이 토큰이 요청한 연산을 인증하지 못하면 예외를 던..

🧾 Auto commit을 false로 설정해야 하는 이유는????

데이터 변경(입력/수정/삭제) 작업을 수행 할 때 여러개의 테이블 사용하는데, 많은 항목을 다뤄야 하기 때문에 데이터가 중복되지 않도록 여러 테이블에 분산 저장한다 Ex) 게시글 저장(실제 여러 입력작업으로 되어있음) 게시글 ----insert----> 게시글 테이블 + 여러개의 첨부파일 ----insert----> 첨부파일 테이블 모든 데이터 변경 작업이 성공시 테이블에 적용 :commit => 단 한개의 작업이라도 실패시 그 전까지 수행한 작업을 모두 취소 :rollback ▶Auto commit이false인 상태에선 데이터 변경 작업이 커넥션 별로 임시 DB에 보관된다 Auto commit이 "true"로 설정되면 각 SQL 쿼리가 개별적인 트랜잭션으로 처리되어 쿼리가 성공적으로 실행될 때마다 자동..

📌 notify()와 notifyAll()의 차이는 뭘까?!

- notify()와 notifyAll()은 자바에서 스레드 간의 통신을 위해 사용되는 메서드 notify(): notify() 메서드는 현재 객체의 모니터를 소유하고 있는 스레드 중 하나를 깨워서 실행을 재개 notify() 메서드를 호출하면 대기 중인 스레드 중 한 개의 스레드만 실행을 재개하고, 나머지 스레드들은 여전히 대기 상태...! 선택적으로 특정 스레드를 깨울 수 있다 호출한 스레드와 동일한 모니터를 소유하고 있는 스레드 중 하나가 깨어난다 notify() 메서드를 호출한 스레드와 동일한 모니터를 소유하고있는 스레드가 없다면, notify() 호출은 아무런 효과가 없다 notifyAll(): notifyAll() 메서드는 현재 객체의 모니터를 소유하고 있는 모든 스레드를 깨워서 실행을 재개 ..

📌 sleep()과 wait()의 차이는?!?!?

sleep(): sleep()은 Thread 클래스에 정의된 메서드 이 메서드는 스레드의 실행을 특정 시간 동안 일시적으로 중지시킨다 sleep()을 호출한 스레드는 CPU를 양보하고, 슬립하는 동안 시스템 리소스를 소비하지 않는다 지정된 시간이 경과하면 스레드는 실행을 재개한다 sleep()은 프로그램에서 지연을 도입하거나 시간 기반 작업을 생성하는 데 유용..! try { // 5초 동안 실행 일시 중지 Thread.sleep(5000); } catch (InterruptedException e) { // 예외 처리 } wait(): wait()은 Object 클래스에 정의된 메서드 이 메서드는 스레드가 보유한 객체의 잠금을 일시적으로 해제한다 wait()을 호출한 스레드는 다른 스레드가 재개하도록 ..

📌 스레드에 여러가지 상태가 있다???

스레드: 프로그래밍에서 동시에 실행되는 일련의 작업 단위 -New (생성됨): 스레드가 생성되고 아직 실행되기 전의 상태 이 상태에서는 아직 스레드가 실행되지 않았으므로, 아래와 같은 코드로 스레드를 생성할 수 있다 Thread thread = new Thread(); -Runnable (실행 가능): 스레드가 실행을 기다리는 상태 스레드가 실행을 시작하려면 CPU 시간 할당을 받아야한다 만약 여러 개의 스레드가 실행 가능한 경우, 스케줄러에 의해 스레드가 선택되고 실행될 수 있다 thread.start(); -Running (실행 중): 스레드가 CPU 시간을 할당받고 실제로 실행 중인 상태 스레드는 Run 메소드 내에서 실행되는 작업을 수행하며, 실행이 완료되기 전에는 Running 상태를 유지한다 ..