자바에서 null을 안전하게 다루는 방법?
- 공개 메서드가 아닌 곳에는 assert를 사용하여 null을 방어할 수 있습니다.
- 공개 메서드에서는 Objects.requireNonNull()을 통해 메서드 인자의 null을 명시적으로 검증할 수 있습니다.
- 리턴 타입에서는 Optional을 활용해 null을 직접 반환하지 않도록 방지할 수 있으며, 이러한 방식들을 통해 사전 조건과 사후 조건을 명확히 정의하고 계약에 의한 설계를 실천할 수 있습니다.
- (assert: 개발 중 내부 상태의 불변 조건을 검증하는 용도로, 공개 API가 아닌 비공개 메서드나 내부 로직에서 사용하는 것이 적절함.)
try-with-resource에 대해서 설명
- Java 7에서 도입된 문법으로 AutoCloseable 또는 Closeable을 구현한 객체를 try 블록 안에서 선언하면 블록이 끝난 후 자동으로 close() 됩니다.
- 이전에는 finally에서 수동으로 자원을 닫아야 했고, 누락 시 자원 누수, 중복 코드, 예외 누락 등의 문제가 발생했는데, 이를 해결하기 위해 try-with-resources가 도입됐습니다.
- Java 9부터는 try 블록 바깥에서 선언된 자원도 try()에 전달할 수 있게 개선되어, 코드 가독성이 더 좋아졌습니다.
@Transactional, (readOnly = true) ?
- @Transactional은 스프링에서 트랜잭션을 선언적으로 관리하기 위한 어노테이션이며, readOnly = true 옵션은 읽기 전용 트랜잭션임을 명시하여 Hibernate의 flush 최적화 등 성능 향상을 유도할 수 있습니다.
- 또한, 코드의 의도를 명확하게 표현할 수 있어 유지보수에도 유리합니다.
- @Transactional(readOnly = true)는 조회만 수행하는 메서드에 붙이는 트랜잭션 설정으로, 내부적으로 flush를 생략함으로써 성능을 최적화하고, 코드 상에서 읽기 전용임을 명확하게 표현할 수 있어 실수도 방지할 수 있습니다.
일관성과 무결성
- 일관성은 트랜잭션이 실행되기 전과 후에 데이터가 항상 비즈니스 규칙에 맞는 유효한 상태를 유지해야 한다는 개념입니다.
- 무결성은 데이터의 정확성과 신뢰성을 보장하기 위해 적용되는 제약 조건의 집합이며, PRIMARY KEY, NOT NULL, FOREIGN KEY 등이 대표적인 예입니다.
트랜잭션 격리수준?
- 트랜잭션 격리수준은 고립도와 성능 트레이드 오프를 조절합니다.
- READ UNCOMMITTED : 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다.
- READ COMMITTED : 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
- REPEATABLE READ : 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
- SERIALIZABLE : 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다. (성능 매우 떨어짐)
JDK, JRE
JDK는 자바 애플리케이션을 개발하고 실행할 수 있는 도구이며 JRE를 포함하고 있습니다.
JRE는 자바 애플리케이션을 실행시키는 데 필요한 도구가 들어있는 차이가 있습니다.
운영서버와 같은 곳에서는 개발에 필요한 도구가 아닌 프로그램을 실행시키는 도구만 필요하기 때문에 개발도구가 들어있는 JDK 아닌 JRE를 설치합니다.
javac MyApp.java → MyApp.class (바이트코드 생성) java MyApp → JVM 시작 → 클래스 로딩 → 바이트코드 검증 → 실행 (인터프리트 또는 JIT으로 기계어 변환)
Redis?
- key-value기반의 In-Memory NoSQL입니다.
- 싱글스레드로 동작하며 빠르게 동작하고 자료구조를 지원합니다.
- 스프링에서는 세션 저장소, 캐시 저장소, 메시지 브로커(Pub/Sub, Stream) 등 다양한 역할로 활용됩니다.
MongoDB?
- JSON 기반의 문서 형태로 데이터를 저장하는 NoSQL 데이터베이스로, 유연한 스키마와 수평 확장에 강한 구조 덕분에 대용량 데이터 처리 및 비정형 데이터 저장에 자주 사용됩니다.
HTTP, HTTPS
- HTTP는 따로 암호화 과정을 거치지 않기 때문에 중간에 패킷을 가로챌 수 있고, 수정할 수 있습니다. 따라서 보안이 취약해짐을 알 수 있습니다. 80번 포트를 사용합니다.
- 이를 보완하기 위해 나온 것이 HTTPS입니다. 중간에 암호화 계층을 거쳐서 패킷을 암호화합니다. 443번 포트를 사용합니다.
- SSL/TLS 암호화 계층을 통해 데이터를 암호화하여 보안성을 확보합니다.
3-Tier, 4-Tier (웹 아키텍처)
- 3-Tier는 클라이언트 - 웹 서버 - DB 서버로 구성된 기본적인 계층 구조이며, 웹 서버가 뷰 처리와 비즈니스 로직을 함께 담당합니다.
- 4-Tier는 비즈니스 로직을 별도의 API 서버로 분리해 웹 서버는 클라이언트 응답 처리에 집중하고, API 서버는 로직과 데이터 처리를 담당하여 보안성과 확장성을 높인 구조입니다.
1. javac MyApp.java
→ 자바 컴파일러(javac)가 소스코드(.java)를 바이트코드(.class)로 변환
2. java MyApp
→ JVM이 시작되면서 다음 단계 수행:
① 클래스 로더: 필요한 클래스(.class 파일) 로딩
② 바이트코드 검증기: 코드의 안전성과 적합성 검사
③ 실행 엔진: 인터프리터 또는 JIT 컴파일러로 실행
- 인터프리터: 한 줄씩 해석하며 실행
- JIT: 자주 쓰이는 바이트코드를 기계어로 변환하여 성능 향상
// javac는 컴파일 단계(정적), java는 실행 단계(동적, JVM이 시작됨)'CS 및 면접복기' 카테고리의 다른 글
| 20250808 (3) | 2025.08.08 |
|---|---|
| 20250807 - ALL (3) | 2025.08.07 |
| 20250805 - DB(1) (4) | 2025.08.05 |
| 20250804 - Java(2) (4) | 2025.08.04 |
| 20250803 - Java (1) (1) | 2025.08.03 |