2025-10-14

오늘 배운 것

싱글톤 패턴에 대해서 설명해주세요

싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴입니다. 주로 공통된 자원을 여러 곳에서 공유해야 할 때 사용됩니다.

예를 들어 데이터베이스 커넥션 풀이나 설정 관리 객체처럼 매번 새로 만들 필요가 없는 객체를 하나만 생성해 재사용함으로써 메모리 낭비를 줄이고 성능을 높일 수 있습니다.

구현 방식은 클래스 내부에 자기 자신을 참조하는 정적 변수를 두고, 외부에서 생성자를 호출하지 못하게 private으로 막은 뒤, getInstance() 같은 정적 메서드를 통해 동일한 인스턴스를 반환합니다.

다만 멀티스레드 환경에서는 동시에 여러 스레드가 접근할 수 있기 때문에 Double-Checked Locking이나 static 초기화 블록 등을 사용해 스레드 안전성을 확보해야 합니다.

스프링에서는 기본적으로 Bean이 싱글톤 스코프로 관리되기 때문에 개발자가 직접 구현하지 않아도 같은 개념이 적용되어 있습니다.

데이터 베이스 설계시 중요하게 생각한 점에 대해서 설명해주세요

데이터베이스를 설계할 때 저는 데이터의 무결성, 성능, 확장성, 유지보수성을 가장 중요하게 생각합니다.

먼저 무결성을 위해 정규화를 통해 중복 데이터를 최소화하고, 외래 키나 제약조건을 설정해 데이터 간의 일관성을 보장합니다. 이렇게 하면 삽입·수정·삭제 시 이상 현상을 예방할 수 있습니다.

다음으로 성능입니다. 데이터 접근 패턴을 고려해 필요한 컬럼에는 인덱스를 생성하고, 조인이나 검색이 많은 테이블은 조회 효율을 우선적으로 설계합니다. 다만, 과도한 인덱스는 쓰기 성능에 영향을 주기 때문에 조회·갱신 비율에 따라 균형을 맞추는 것을 중요하게 생각합니다.

또한 확장성도 고려합니다. 향후 데이터 증가나 서비스 기능 확장을 대비해 테이블 구조를 유연하게 설계하고, ENUM보다는 코드 테이블을 사용하거나 파티셔닝 구조를 고려하기도 합니다.

마지막으로 보안성과 유지보수성 측면에서 권한 관리, 트랜잭션 제어, 데이터 백업 구조도 함께 설계합니다.

정규화와 반정규화의 장단점에 대해서 설명해주세요

규화는 데이터를 중복 없이 구조화해 무결성과 일관성을 유지하는 설계 방식입니다. 테이블을 세분화하고 관계를 명확히 정의함으로써 삽입·수정·삭제 시 이상 현상을 방지할 수 있습니다. 즉, 데이터의 정확성과 유지보수성 측면에서 유리합니다.

하지만 테이블이 많아지고 조인이 복잡해지면 조회 성능이 떨어지는 단점이 있습니다. 그래서 트래픽이 많거나 실시간 조회가 중요한 시스템에서는 일부러 반정규화를 적용하기도 합니다.

반정규화는 데이터를 일부 중복 저장하거나 테이블을 통합해 조회 속도를 높이는 대신, 데이터 일관성 관리가 어려워지는 방식입니다. 즉, 읽기 성능은 향상되지만 수정 시 중복 데이터의 불일치 위험이 있습니다.

저는 실제 설계에서는 서비스 성격에 따라 두 가지를 적절히 혼합하는 것이 중요하다고 생각합니다. 트랜잭션이 중요한 부분은 정규화하고, 조회가 빈번하고 변동이 적은 데이터는 반정규화를 적용해 성능을 보완하는 식으로 균형을 맞춥니다.

PostgresSQL, MySQL, Oracle의 장단점에대해서 설명해주세요

세 DBMS 모두 관계형 데이터베이스지만, 각기 다른 강점과 목적을 가지고 있습니다.

MySQL은 가볍고 빠른 성능, 그리고 쉬운 사용성이 가장 큰 장점입니다. 웹 서비스나 스타트업 환경에서 많이 사용되며, 읽기 위주의 트래픽 처리에 강합니다. 다만 트랜잭션 처리나 복잡한 쿼리 최적화 기능은 상대적으로 제한적입니다.

PostgreSQL은 오픈소스 중에서도 가장 표준 SQL에 충실하고, 트랜잭션 일관성(ACID) 과 확장성이 우수합니다. JSON, GIS, Window 함수 등 고급 기능 지원이 좋아 데이터 정합성이 중요한 시스템에서 많이 사용됩니다. 단점은 상대적으로 설정이 복잡하고, 초기 학습 비용이 높습니다.

Oracle은 기업 환경에서 가장 널리 쓰이는 상용 DB로, 대용량 트랜잭션, 보안, 백업/복구 기능이 매우 강력합니다. 특히 동시성 제어나 파티셔닝, 클러스터링 기능이 뛰어나 안정성이 중요한 금융권에서 주로 사용됩니다. 하지만 라이선스 비용이 높고, 운영 복잡도가 있는 편입니다.

결국 서비스 규모와 목적에 따라 다르지만, MySQL은 빠른 개발과 웹 서비스, PostgreSQL은 데이터 정합성과 확장성, Oracle은 안정성과 트랜잭션 중심의 대규모 시스템에 적합하다고 생각합니다.

자바 메모리 영역에 대해서 설명해주세요

자바는 JVM 위에서 동작하기 때문에, 메모리도 JVM이 관리하는 여러 영역으로 나뉩니다.

먼저 메서드 영역(Method Area) 은 클래스의 메타데이터, static 변수, 메서드 코드 등이 저장되는 공간입니다. 프로그램 전체에서 공통으로 사용되며, 클래스가 로딩될 때 한 번만 생성됩니다.

힙(Heap) 은 실제 객체 인스턴스가 저장되는 영역입니다. new로 생성된 객체가 모두 이곳에 올라가며, GC(Garbage Collector)가 불필요한 객체를 찾아 자동으로 메모리를 해제합니다.

스택(Stack) 은 메서드 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역입니다. 메서드가 끝나면 스택 프레임도 함께 제거되어 메모리가 자동 관리됩니다.

이 외에도 각 스레드마다 명령어 주소를 저장하는 PC 레지스터와, JNI 같은 네이티브 코드를 위한 네이티브 메서드 스택이 있습니다.

정리하자면, 힙은 객체가 저장되고 GC가 관리하며, 스택은 지역 변수와 호출 정보를 관리하는 휘발성 메모리라고 이해할 수 있습니다.

results matching ""

    No results matching ""