스터디 현황

인터페이스?
"interface는 자바에서 한 단계 더 높은 추상화를 하기 위해 사용된다. 구현 로직은 존재하지 않으며 메소드에 대한 입력(input), 출력(output)만 정의하고 있다.
interface를 활용해 추상화를 하는 이유는 소프트웨어에 변경이 발생할 경우 소스 코드에 변경을 최소화함으로써 유지보수 비용을 줄이고, 변화에 빠르게 대응하기 위함이다. 하지만 추상화를 하려면 개발 비용의 증가가 발생한다.
인터페이스에서 공통적으로 사용해야하는 기능이 있다면 최상위 인터페이스에 default로 추가를 할 수 있다."
객체지향 특징
"추상화-불필요한 부분(구현 코드)을 숨긴다.인터페이스와 구현을 분리한다.
캡슐화-데이터 캡슐화 : 필드와 메서드를 하나로 묶는 것 (객체 생성)
은닉화 : 객체의 세부 내용이 외부에 드러나지 않아 외부에서 데이터를 직접 접근하는 것을 방지한다.
상속-어떤 실체로부터 공통적인 부분이나 관심 있는 특성들만 한곳에 모은것을 의미한다. 자식클래스가 부모클래스의 특징과 기능을 물려받는 것
클래스를 상속 받아 수정하여 사용하기 때문에 중복 코드를 줄일 수 있다. 부모클래스의 수정으로 모든 자식클래스들도 수정되는 효과
클래스에 메소드 추가가 어려운 경우 사용. 자신이 아닌 남이 만든 클래스를 가져오는 경우 (수정 불가)
클래스가 다양한 곳에서 상속 받아 쓰이는 경우 (메서드를 추가하면 다른 곳에서 불필요한 기능이 포함될 수 있음)
다형성-같은 모양의 함수가 상황에 따라 다르게 동작 하는것을 의미한다. 오버라이딩, 오버로딩"
객체지향 설계 5원칙(SOLID)
"1. SRP(Single Responsibility Principle, 단일 책임 원칙)
작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어야 한다.
OCP(Open Close Principle, 개방폐쇄의 원칙)
소프트웨어의 구성요소는 확장에 열려있고 변경에는 닫혀있다. 변경을 위한 비용은 가능하면 줄이고 확장을 위한 비용은 극대화해야한다.
요구사항의 변경이나 추가 사항이 발생하여도 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
LSP(The Liskov Substitution Principle, 리스코프 치환의 원칙)
서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다.
상속은 궁극적으로 다형성을 통한 확장성을 목표로 한다. LSP도 서브클래스가 확장에 대한 인터페이스를 준수해야함을 의미한다.
ISP(Interface Segregation Principle, 인터페이스 분리의 원칙)
한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. → 다른 클래스에 종속될 때는 가능한 최소한의 인터페이스만을 사용해야 한다.
DIP(Dependency Inversion Principle, 의존성 역전의 원칙)
하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위치 관계를 끊는 의미의 역전이다.
저수준 모듈이 고수준 모듈에 의존하게 되는 것을 의미한다.
추상화에 의존하고 구체화에 의존하면 안 된다. 즉, 하위 모듈이 상위 모듈에서 정의한 추상 타입(인터페이스)에 의존하여야 한다."
다른 언어와 비교하였을 때 Java의 장점
"플랫폼에 구애받지 않고 JVM이 설치된 모든 장치에서 동작한다.
->운영체제의 영향이 없이 동작하며 멀티 스레드를 지원하지 않는 OS에서도 자바 언어를 사용하면 멀티스레드를 구현할 수 있다.
객체지향 언어이다.
수많은 개발자와 레퍼런스가 있어 문제가 발생하였을 때, 트러블슈팅을 하기 쉽다.
디버깅하는 실행 속도를 개선하기 위해 JIT 컴파일러가 사용된다.
GC(가비지 컬렉션)이 존재하여 객체의 소멸을 스스로 해준다.
트랜잭션의 개념과 트랜잭션의 특징
"트렌잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 뜻한다.
Atimicity(원자성)
트랜잭션의 연산은 DB에 모두 반영되거나 아예 반영되지 않아야 한다,
Consistency(일관성)
트랜잭션이 성공적으로 작업을 수행한 후에도 데이터베이스는 일관성있는 상태를 유지해야한다.
e.g. 돈을 송금하기 전/후의 돈의 총 합은 같아야 한다.
Isolation(독립성)
둘 이상의 트랜잭션이 실행되고 있을 경우 어떤 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다.
Durability(지속성, 영속성)
성공적으로 수행을 마친 트랜잭션의 결과는 시스템이 고장나도 영구적으로 반영되어야 한다."
조인(Join)은 무엇이며 어떤 종류들이 있을까요?
"조인이란 두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법이다. 테이블을 연결하려면 1개 이상의 속성을 공유하고 있어야하여 이를 통해 데이터 검색을 한다.
INNER JOIN - 기준 테이블과 조인 테이블의 중복된 교집합( A ∩ B )을 추출하게 된다.
LEFT OUTER JOIN-기준(왼쪽) 테이블과 조인 테이블의 교집합과 차집합의 연산 결과를 합친 것과 같다.
RIGHT OUTER JOIN-LEFT OUTER JOIN과 같으나 기준 테이블이 왼쪽에서 오른쪽으로 바뀐 것이다.
FULL OUTER JOIN-두 테이블의 합집합을 조회하게 된다.
CROSS JOIN-모든 경우의 수를 표현해주는 방식이다.
SELF JOIN-자기 자신과 조인하는 것으로 자신이 갖고 있는 컬럼을 다양하게 변형시켜 사용할 때 자주 사용한다."
DDL, DML, DCL 은 무엇일까요?
"- DDL(Data Definition Language)
데이터베이스 스키마를 정의하거나 조작하기 위한 언어
대상은 SCHEMA, DOMAIN, TABLE, VIEW, INDEX 등이 있다.
명령어를 입력하는 순간 작업이 즉시 완료(Auto Commit)된다.
CREATE, ALTER, DROP. RENAME, COMMENT, TRUNCATE
DML(Data Manipulation Language)
데이터베이스 내부 레코드를 관리하기 위한 언어로 데이터 추가, 변경, 삭제 등의 작업을 수행한다.
AUTO COMMIT이 되지 않아, 작업 완료시 트랜잭션 내에서 COMMIT 명령어를 통해 반영을 해야하며 ROLLBACK이 가능하다.
SELECT, INSERT, UPDATE, DELETE 등
DCL(Data Control Language)
데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 언어이다.
GRANT, REVOKE, COMMIT, ROLLBACK"
Key에 대해 설명해주세요
"1. 후보키 (candidate key)
릴레이션을 구성하는 속성들 중 튜플을 유일하게 실별할 수 있는 속성들의 부분집합을 의미한다.
모든 릴레이션은 반드시 하나 이상의 후보키를 가져야 한다.
릴레이션에 있는 모든 튜플에 대해 유일성과 최소성을 만족시켜야 한다.
->유일성: Key로 하나의 Tuple을 유일하게 식별할 수 있다.
->최소성: 꼭 필요한 속성으로만 구성된다.
한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성으로 후보키중에서 선택된 Main key이다.
무결성 특징을 갖는다.
->무결성이란 데이터의 정확성과 일관성을 유지하고, 데이터의 결손과 부정합이 없음을 보증하는 것을 의미한다.
-->Null값을 가질 수 없다.
-->중복된 값이 저장될 수 없다.
기본키를 수정하기 위해서는 삭제를 한 후 추가를 하는 식으로 동작한다.
대체키 (Alternate Key)
후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키를 의미한다.
보조키라고 부른다
슈퍼키 (Super key)
한개의 릴레이션 내에 있는 속성들의 집합으로 구성된 키이다.
ex) <학생> 릴레이션에 '학번', '주민번호', '학번'+'주민번호', '학번'+'주민번호'+'성명' 등으로 슈퍼키를 구성할 수 있습니다.
릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만 최소성은 만족시키지 못한다.
집합에 속한 모든 속성을 엮지 않아도 유일성이 있는 슈퍼키를 만들 수 있는 상황이 존재하여 최소성을 만족하지 못한다 한다.
외래키 (Foreign Key)
참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는데 중요한 도구로 사용된다.
참조 무결성의 조건으로 외래키로 참조 테이블의 기본키에 없는 값은 입력할 수 없다."
NoSQL에 대해서 설명해주세요
"NoSQL 데이터베이스는 기존의 관계형 데이터베이스(RDBMS)와 다른 접근 방식을 제공하는 데이터 저장 기술입니다.
""Not Only SQL"" 또는 ""Non-SQL""로도 불리며, 관계형 데이터베이스의 전통적인 구조를 벗어나 다양한 데이터 저장 및 쿼리 방식을 가능하게 합니다.
NoSQL은 대규모 분산 데이터 처리에 특화되어 있으며, 유연한 스키마, 빠른 확장성, 고성능을 제공합니다.
NoSQL 사용 사례
빅데이터 처리: 대규모 비정형 데이터를 효율적으로 처리하고 분석할 수 있습니다.
실시간 웹 애플리케이션: 고속 데이터 처리가 필요한 웹 애플리케이션에 적합합니다.
분산 시스템: 데이터를 여러 서버에 분산하여 저장하고 처리할 수 있어, 시스템의 가용성을 높일 수 있습니다.
NoSQL의 장단점
장점: 유연한 데이터 모델, 빠른 확장성, 고성능, 분산 처리 지원 등이 있습니다.
단점: 트랜잭션 처리와 복잡한 쿼리 수행에서는 관계형 데이터베이스보다 제한적일 수 있습니다.
NoSQL 데이터베이스는 현대적 애플리케이션의 다양하고 복잡한 데이터 요구사항을 충족시키기 위한 강력한 솔루션을 제공합니다. 빅데이터, 실시간 처리, 분산 시스템 등 다양한 분야에서 그 가치를 인정받고 있습니다. 🚀"
프로젝트에서 리액트로 구현하셨던데 리액트 구현, jsp 구현의 차이에 대해 설명해주세요
"리액트(React)와 JSP(Java Server Pages)는 웹 애플리케이션을 구현하는 데 사용되는 기술이지만, 그 접근 방식과 사용 목적에 있어서 상당한 차이가 있습니다.
우선, React는 사용자 인터페이스를 만들기 위한 JavaScript 라이브러리로 클라이언트 사이드 라이브러리입니다. 사용자와 상호작용하며 동적으로 UI를 업데이트할 수 있습니다.
또 가상 DOM을 사용하여 실제 DOM에 접근하여 발생할 수 있는 문제를 줄이고, 부분 업데이트가 가능합니다.
컴포넌트 기반으로 UI를 나누어 관리하며, 이를 통해 코드 재사용성, 유지보수성을 높여줍니다.
jsp는 서버 사이드 스크립팅 언어입니다. HTML 내에 자바 코드를 삽입하여 웹 페이지를 동적으로 생성합니다.
jsp파일은 서버에서 서블릿으로 변환되어 실행됩니다. 이 과정에서 html을 생성하여 클라이언트에게 전송합니다.
이런 차이가 있기 때문에 프로젝트 요구사항, 목적에 따라 적절한 기술을 선택하는 것이 필요합니다. "
Interface와 abstract class는 어떤 차이가 있을까요?
"두 종류 모두 추상화를 위해 사용하는 기술들이다. 하지만 둘은 사용 용도가 다르다.
-인터페이스
100% 추상화된 기본 설계도이다.
인스턴스 필드를 소유할 수 없다.
다중 상속(구현)이 가능하다.
포멧만 주어지고 구현체가 다 정해야한다.
공통 기능으로는 default 메서드로 정의 가능하다.
-추상 클래스
상속을 통해 자속 클래스에서 완성을 유도하는 미완성 설계도이다.
한 개의 추상 클래스만 상속 가능하다.
인스턴스 필드를 소유할 수 있다.
인스턴스 메서드를 만들고 사용할 수 있다.
-각각 언제 사용하는 것이 좋은가??
1) 추상클래스 → is - a → ""~이다""
2) 인터페이스 → has - a→ ""~을 할 수 있는""
인터페이스는 클라이언트에서 사용할 때 만드는 것이 좋고, 추상클래스는 내부에서 기능을 확장할 때 쓰는 것이 좋다.
자식 클래스가 부모 클래스의 기능을 완벽히 똑같이 필요한 경우 추상 클래스를 사용한다.
자식 클래스들이 부모 클래스의 같은 기능이 필요한데, 다른 구현을 가져야 하는 경우 인터페이스를 사용한다."
정규화의 장단점과 정규화 과정
"정규화란 이상현상(Anomaly)이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다.
데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질을 보장하고 성능의 향상을 위해 수행한다.
정규화 수준이 높을 수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다.
정규화의 장점
데이터 구조의 안정성 및 무결성을 유지한다.
데이터 중복을 배제하여 이상(Anomaly)의 발생 방지 및 자료 저장 공간의 최소화가 가능하다
정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
테이블의 구성을 논리적이고 직관적으로 할 수 있다.
개체와 속성의 누락 여부 확인이 가능하다
정규화 단점
릴레이션의 분해로 Join연산이 많아진다.
쿼리를 통한 데이터 처리 속도가 빨라질 수도 있고 느려질 수도 있다.
→ 많은 조인으로 인해 성능저하가 발생한다면 반정규화를 적용할 수 있다.
1) 1NF
릴레이션에 속한 모든 도메인이 원자 값(Atomic Value, 하나의 값)으로만 되어 있는 정규형이다. 즉, 릴레이션의 모든 속성 값이 원자 값으로만 되어 있는 정규형이다.
아래의 조건을 만족해야한다.
-각 컬럼은 하나의 속성(원자 값)만을 가져야 한다.
-하나의 컬럼은 같은 종류나 타입을 가져야 한다.
-각 컬럼은 유일한(unique)한 값을 가져야 한다.
2) 2NF
제1정규화를 진행한 테이블에 대해 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하도록 테이블을 분해하는 것이다. → 부분적 종속(Partial Dependency)이 없어야 한다
-완전 함수적 종속이란? 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미한다.
즉, 테이블에서 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다는 뜻이다. → 키1 만으로 다른 컬럼의 값을 알 수 있으면 안 된다.
3) 3NF
제2정규화를 진행한 테이블에 대해 기본키가 아닌 모든 속성이 기본키에 대해 이행적 종석을 만족하지 않도록 테이블을 분해하는 것이다.
-이행적 함수 종속은 A→B, B→C이면 A→C가 성립되는 것을 의미한다.
e.g. 아래의 링크의 예시에서는 Id, 등급, 할인율 컬럼이 있을 때, ID를 통해 등급을 확인할 수 있고, 등급을 통해 등급별 할인율을 매칭할 수 있다면, ID를 통해서도 할인율을 알 수 있는 종속성이 생기게 되는데 이것이 바로 이행적 종속이다."
PL/SQL이란?
"PL/SQL은 Oracle 데이터베이스에서 사용되는 프로그래밍 언어로, 데이터 처리 및 관리를 위한 기능을 제공합니다. 이를 통해 데이터베이스 내에서 복잡한 로직을 구현하고 실행할 수 있습니다. PL/SQL은 SQL 명령어와 함께 사용되며, 데이터베이스와의 상호작용을 효율적으로 관리할 수 있도록 도와줍니다.
PL/SQL의 주요 구성 요소
변수 및 상수: 데이터를 저장하고 처리하는 데 사용되는 변수와 상수를 선언할 수 있습니다.
조건문 및 반복문: IF, LOOP 등의 조건문과 반복문을 사용하여 복잡한 로직을 구현할 수 있습니다.
커서: 데이터베이스에서 조회된 결과 집합을 순차적으로 처리하기 위해 사용됩니다.
예외 처리: 프로그램 실행 중 발생할 수 있는 예외 상황을 처리하기 위한 구문을 제공합니다.
프로시저, 함수, 트리거: 데이터베이스 내에서 실행할 수 있는 저장된 서브프로그램을 작성할 수 있습니다.
PL/SQL을 통해 데이터베이스 내에서 복잡한 비즈니스 로직을 효율적으로 처리할 수 있으며, 데이터 처리의 안정성과 성능을 향상시킬 수 있습니다."
프레임워크란 무엇일까요?
"프레임워크는 소프트웨어의 특정 문제를 해결하기 위한 라이브러리와 도구들의 집합으로, 개발자가 애플리케이션을 더 빠르고 효율적으로 개발할 수 있도록 도와줍니다.
다양한 프로그래밍 언어와 환경에 맞는 여러 프레임워크가 존재합니다. 예를 들어, 자바에는 Spring, 자바스크립트에는 React, AngularJS 등이 있습니다.
*React는 라이브러리임 ! 자료에 따라서 프레임워크와 라이브러리 혼동이 있으니 예시로 들지 않는 것이 좋을듯
장점: 기본적인 구조가 제공되므로 개발 시간을 단축할 수 있고, 유지보수가 용이합니다. 또한, 코드의 일관성을 유지할 수 있습니다.
단점: 프레임워크에 대한 학습이 필요하며, 프레임워크가 정한 규칙 내에서만 작업을 해야 하므로 개발의 자유도가 다소 제한될 수 있습니다.
프레임워크를 잘 활용하면 개발 과정을 효율적으로 만들 수 있어요! 하지만 어떤 프레임워크를 선택할지, 그리고 그 프레임워크를 어떻게 활용할지는 프로젝트의 요구사항과 개발자의 선호도에 따라 달라질 수 있습니다."
가비지컬렉터(GC)가 무엇인지 설명하시오
가비지컬렉션(Garbage Collection)이란 Java프로그램이 자동으로 메모리를 관리해주는 프로세스를 말한다. Java프로그램은 JVM에서 실행될 수 있는 바이트코드로 컴파일된다. Java프로그램이 JVM에서 실행되면 메모리영역인 힙에 객체가 생성된다. 가비지컬렉터는 사용되지 않는 객체나 참조될 수 없는 객체를 찾아서 삭제하여 메모리를 자동으로 관리해준다.
Java의 메모리 영역에 대해서 설명하시오
"Java의 Runtime Data Area는 총 다섯개의 영역으로 이루어져있다.
Method Area : 클래스에 대한 정보가 올라오는 영역. 모든 쓰레드가 공유
Heap : new 키워드를 통해 생성된 인스턴스가 생성되는 영역. 모든 쓰레드가 공유, GC의 대상이 됨.
Stack : 지역변수, 매개변수, 리턴값 등 임시적으로 사용되는 값들이 저장되는 영역
PC Register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역
Native Method Stack : Native 언어로 작성된 코드를 실행하기 위한 영역. 네이티브 언어란 C, C++, Asselbly등 Java외 언어를 말한다.
참고자료: https://velog.io/@impala/JAVA-JVM-Runtime-Data-Area"
Spring의 주요 특징인 DI, IoC, AOP에 대해 설명
"스프링(Spring)은 Java 언어를 기반으로 한 애플리케이션을 개발하기 위한 경량의 웹 애플리케이션 프레임워크.
의존성 주입(Dependency Injection, DI):
DI는 객체 간의 의존 관계를 클래스 내부에서 직접 생성하지 않고, 외부에서 주입하는 방식. 이를 통해 객체 간의 결합도를 낮추고 유연한 구조를 갖출 수 있습니다. 스프링은 DI를 구현하기 위해 IoC(Inversion of Control) 컨테이너를 제공합니다.
제어의 역전(역행)(Inversion of Control, IOC):
IOC는 객체의 생성과 관리를 개발자가 직접하지 않고 프레임워크에 위임하는 것. 스프링에서는 IOC 컨테이너가 객체의 생명주기를 관리하고 의존성을 주입하여 개발자가 객체 간의 결합도를 낮출 수 있도록 도와줍니다.
관점지향 프로그래밍 (Aspect Oriented Programming, AOP):
로깅, 보안, 트랜잭션 관리와 같이 반복되는 공통 관심사를 모듈로 분리하여 적절한 시기에 적용하는 것. 이를 통해 코드 중복을 줄이고 유지보수성을 높이는 것이 목적."
Spring과 Spring Boot의 차이점
"1. 설정의 자동화 및 간소화:
MVC란? 그리고 Model1패턴, Model2패턴 차이는?
"MVC(Model-View-Controller)는 소프트웨어 개발에서 흔히 발생하는 문제를 해결하고 개발 과정을 더 쉽고 조직적으로 만들기 위해 사용되는 디자인 패턴입니다. MVC는 모델(Model) 데이터 제공, 뷰(View) 화면 표시, 컨트롤러(Controller) 요청 흐름 처리 및 제어합니다. 이를 통해 로직을 분리하여 유지 관리와 공유를 용이하게 합니다.
MVC1: JSP가 뷰(View)와 컨트롤러(Controller) 역할을 모두 담당합니다. 작은 프로젝트에 적합하지만 유지 관리와 협업에 어려움이 있습니다.
MVC2: 컨트롤러(Controller)와 뷰(View)를 분리하여 유지 관리와 재사용성을 향상시킵니다. 웹 브라우저의 요청을 하나의 서블릿이 받아 처리하는 모듈화된 구조입니다."
스레드란 무엇이고, 자바에서 어떻게 생성하죠?
"스레드란 프로세스 내에서 실행되는 작은 작업 단위입니다. 여러 개의 스레드가 하나의 프로세스 내에서 동작할 수 있으며, 이를 통해 병렬 처리가 가능해집니다.
스레드는 프로세스의 데이터에 직접 접근할 수 있고, 각각의 스레드는 별도의 스택 메모리 영역을 가집니다. 이를 통해 효율적 자원 사용, 병렬 처리, 시스템 성능향상이라는 장점이 있습니다.
자바에서 스레드를 생성하는 방법은 스레드 클래스 상속, 러너블 인터페이스 구현의 방법이 있습니다.
첫번째 방법은 Thread 클래스를 상속받은 후, run() 메서드를 오버라이드하여 스레드가 실행할 코드를 정의할 수 있습니다.
두 번째 방법은 Runnable 인터페이스를 구현한 뒤 run()메소드에 스레드가 실행할 코드를 작성합니다. 그 다음, Runnable 객체를 Thread 객체의 생성자에 전달하여 스레드를 생성합니다. "
HTTP 상태코드란 무엇이며 어떤 것들이 존재하는지 설명해보시오.
"HTTP 상태코드란 클라이언트가 보낸 http요청이 성공적으로 완료되었는지를 알려주는 코드이다.
100번대(Information): 요청이 처리되어 수신중
200번대(Successful): 요청이 정상적으로 처리됨
300번대(Redirection): 요청을 완료하려면 추가 행동이 필요
400번대(Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 처리할 수 없음
500번대(Server Error): 서버오류, 서버가 정상 요청을 처리하지 못함"
스프링의 의존 자동 주입 방법
"스프링에는 @Autowired를 사용한 3가지 의존성 주입방법이 있다.
1. 생성자 주입(Constructor Injection): 생성자를 통해 객체를 주입받는 방법이다. 클래스의 생성자가 하나이고 주입받는 객체가 빈으로 등록되어 있다면 @Autowired를 생략가능하다.
2. 필드 주입(Field Injection): 필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성이 주입됨. //우리가 사용한 방법
3. 수정자 주입(Setter Injection): setter 메서드에 @Autowired를 사용하여 객체를 주입한다. 수정자 주입을 하게되면 setter 메서드의 접근제어자가 public이 되어야 하기 때문에 보안에 취약하다는 단점이 있다."
클래스와 인스턴스가 무엇이고, 둘의 차이점
"- 클래스
: 객체를 생성하기 위한 템플릿으로, 객체의 공통된 특성(속성과 메서드)을 정의.
-차이점
1. 추상성: 클래스는 추상적인 개념으로, 객체를 생성하기 위한 틀을 제공합니다. 반면에 인스턴스는 클래스를 기반으로 실제로 생성된 객체를 의미합니다.
2. 생성 여부: 클래스는 객체를 생성하기 위한 설계도이므로 메모리에 할당되지 않습니다. 반면 인스턴스는 클래스를 기반으로 메모리에 할당되어 실제 작업을 수행하는 객체입니다.
3. 개수: 클래스는 하나의 템플릿으로 여러 인스턴스를 생성할 수 있습니다. 각 인스턴스는 고유한 상태를 가집니다."
HTTP와 HTTPS의 차이점에 대해서 설명해주세요
"HTTP(HyperText Transfer Protocol)와 HTTPS(HyperText Transfer Protocol Secure)는 인터넷에서 데이터를 전송하기 위해 사용되는 프로토콜(protocol)입니다. 이 둘 사이에는 중요한 차이점이 있습니다.
보안성
HTTP는 따로 암호화 과정을 거치지 않기 때문에 중간에 패킷을 가로챌 수 있고, 수정할 수 있다. 즉, HTTP는 보안에 취약점이 있어 이를 보완하기 위해 HTTPS가 나왔다. HTTPS는 중간에 암호화 계층을 거쳐서 패킷을 암호화한다.
포트번호
HTTP는 통신규약으로 80포트를 사용하며 HTTPS는 443포트를 사용한다.
속도
HTTPS는 대칭키와 비대칭키 암호화를 모두 사용하여 빠른 연산속도와 안정성을 모두 얻고 있다. HTTP와 비교하였을 때는 키의 암호화/복호화 과정이 필요하여 속도가 느리긴하지만 거의 차이를 느끼기 어렵다."
API가 무엇인지 설명해주세요.
"API(Application Programming Interface)는 응용 프로그램 간의 상호작용을 가능하게 하는 중요한 기술입니다.
그 종류는 크게 프라이빗, 파트너, 퍼블릭이 있습니다.
이를 통해 개발자는 다양한 소프트웨어 컴포넌트를 연결하고, 데이터를 교환하며, 기능을 통합할 수 있습니다.
API의 주된 목적은 시스템의 내부 세부 사항을 숨기고, 프로그래머가 유용하게 사용하고 일정하게 관리할 수 있도록 하는 것입니다.
API는 현대 소프트웨어 개발에서 빼놓을 수 없는 핵심 요소입니다. 다양한 애플리케이션과 서비스를 연결하고, 효율적으로 데이터를 교환하며, 사용자에게 더 나은 경험을 제공하는 데 중요한 역할을 합니다.
웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라고 생각할 수 있습니다."
REST와 RESTful API에 대해서 설명해 주세요
"REST는 Representational State Transfer의 약자로, 어떤 자원에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행하기 위해 URI(Resource)로 요청을 보내는 것을 말합니다.
REST는 서버와 클라이언트의 역할을 명확히 분리하며, 무상태성(Stateless), 캐시 처리 가능성, 계층화, 코드 온 디맨드(선택적), 일관된 인터페이스 등의 특징을 가집니다.
RESTful API는 REST 원칙을 따르는 API를 의미합니다. 이는 분산 하이퍼미디어 시스템(예: 월드 와이드 웹)에서 사용되며, HTTP 프로토콜과 웹 기술을 활용하여 자원을 HTTP URI로 표현하고, HTTP 메소드를 통해 CRUD 작업을 적용합니다.
DB connection Pool과 HIkari CP에 대해서 설명하시오
"DB 커넥션이란 어플리케이션이 DB와의 통신을 하기 위해 연결상태를 유지하는 것을 말한다. 이 때 DBMS 엔진과 어플리케이션과의 연결에는 상당한 시간이 필요하기 때문에 요청이 올 때 마다 연결을 생성하고 끊는 것은 매우 비효율적이다. 때문에 DB커넥션을 여러개 생성하여 Pool에 저장하였다가 클라이언트 요청이 올 때 커넥션을 빌려주고 작업이 완료되면 커넥션을 반납하는 커넥션 풀이 개발되었다. 커넥션 풀 기술을 통해 DB에서 커넥션을 생성하고 삭제하는 비용을 줄일 수 있고, DB커넥션의 수를 제한하여 서버의 자원고갈을 방지할 수 있다.
HikariCP란 Spring Boot 2.0부터 default로 사용하고 있는 JDBC 커넥션풀이다. 매우 빠르고 가볍다는 것이 특징이다."
자바의 JVM의 역할에 대해서 설명해 보시오.
"자바 가상 머신(JVM, Java Virtual Machine)은 자바 프로그램이 실행되는 환경을 제공하는 핵심 구성 요소입니다. JVM은 자바 바이트 코드를 실제 기계 코드로 변환하고 실행하는 역할을 담당합니다. 이를 통해 자바 프로그램은 여러 플랫폼에서 동일한 방식으로 실행될 수 있습니다. 여기에서 JVM의 주요 역할을 살펴보겠습니다:
쿠키와 세션의 차이는?
"쿠키와 세션은 웹 개발에서 사용되는 클라이언트-서버 간의 상태 유지를 위한 기술입니다. 주요한 차이점을 살펴보겠습니다:
저장 위치
쿠키(Cookie): 쿠키는 클라이언트 측에 저장됩니다. 클라이언트의 웹 브라우저에 텍스트 파일 형태로 저장되며, 서버나 웹 애플리케이션에서 생성하여 클라이언트에게 전송됩니다.
세션(Session): 세션은 서버 측에 저장됩니다. 서버 메모리나 데이터베이스에 세션 객체로 저장되며, 클라이언트에는 세션 ID만 전달됩니다.
보안
쿠키(Cookie): 쿠키는 클라이언트에 저장되므로 클라이언트에서 수정 가능합니다. 따라서 중요한 정보를 저장할 때는 보안 문제를 고려해야 합니다. 쿠키에는 만료 날짜나 경로를 설정하여 보안을 강화할 수 있습니다.
세션(Session): 세션은 서버에 저장되기 때문에 클라이언트에서 직접 수정할 수 없습니다. 세션 ID만 쿠키에 저장되어 있으므로 세션 하이재킹과 같은 공격을 막기 위해 보안을 강화할 수 있습니다.
저장 용량
쿠키(Cookie): 쿠키는 일반적으로 클라이언트 당 4KB의 저장 용량 제한이 있습니다. 너무 많은 쿠키가 쌓이면 성능에 영향을 줄 수 있습니다.
세션(Session): 세션은 서버 메모리나 데이터베이스에 저장되므로 일반적으로 더 많은 데이터를 저장할 수 있습니다. 하지만 세션도 서버 자원을 사용하므로 과도한 세션 사용은 서버 부하를 유발할 수 있습니다.
수명
쿠키(Cookie): 쿠키에는 만료 날짜를 설정하여 지속적으로 유지되도록 할 수 있습니다. 만료 날짜를 설정하지 않으면 브라우저를 종료할 때까지 유지됩니다.
세션(Session): 세션은 일반적으로 사용자가 로그인한 후에 생성되고, 사용자가 로그아웃하거나 브라우저를 종료할 때까지 유지됩니다. 세션의 유지 기간은 서버의 설정에 따라 다를 수 있습니다.
쿠키와 세션은 각각의 장단점을 가지고 있으며, 적절한 상황에서 사용해야 합니다. 보안이 중요한 정보는 세션을 활용하여 서버에 저장하고, 일시적인 정보나 사용자 설정과 같은 정보는 쿠키를 활용하여 클라이언트에 저장하는 것이 일반적인 패턴입니다."
Ajax, Axios 차이?
"비동기 처리 방식은 웹 애플리케이션에서 사용자의 경험을 향상시키기 위해 널리 사용되는 기술입니다. 이 방식을 통해 웹 페이지 전체를 새로고침하지 않고도 서버와 통신하여 데이터를 업데이트할 수 있습니다.
Ajax (Asynchronous JavaScript and XML)
정의: Ajax는 비동기적 웹 애플리케이션의 제작을 위한 웹 개발 기법입니다. JavaScript를 사용하여 서버와 비동기적으로 통신하고, XML, JSON 등의 데이터를 주고받아 웹 페이지의 일부만을 업데이트할 수 있게 합니다.
장점: 페이지 전체를 새로고침하지 않고도 데이터를 업데이트할 수 있어 사용자 경험을 크게 향상시킵니다.
사용 예: 사용자가 웹 폼에 데이터를 입력하고 제출 버튼을 클릭할 때, 페이지 전체를 새로고침하지 않고 서버에 데이터를 보내고 결과를 받아올 수 있습니다.
Axios
정의: Axios는 Promise 기반의 HTTP 클라이언트로, 브라우저와 Node.js에서 사용할 수 있습니다. Ajax와 유사하게 비동기 통신을 수행하지만, 더욱 진보된 기능과 간결한 API를 제공합니다.
장점: Axios는 자동으로 JSON 데이터 변환, HTTP 요청 취소, HTTP 요청과 응답을 인터셉트하는 기능 등을 제공합니다. 또한, 브라우저와 Node.js 모두에서 사용할 수 있어 범용성이 높습니다.
사용 예: 웹 애플리케이션에서 사용자가 입력한 정보를 서버로 보내고, 그에 대한 응답을 받아 처리할 때 Axios를 사용하여 간편하게 비동기 통신을 구현할 수 있습니다.
비동기 처리 방식은 현대 웹 애플리케이션 개발에서 필수적인 요소입니다. Ajax와 Axios는 이러한 비동기 통신을 구현하는 데 있어 각각의 장점과 특징을 가지고 있으며, 프로젝트의 요구 사항에 따라 적절한 기술을 선택하여 사용할 수 있습니다."
비동기처리와 동기처리의 차이
"비동기 처리(Asynchronous Processing)
정의: 비동기 처리는 현재 실행 중인 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행하는 방식입니다. 이는 작업의 완료 여부와 상관없이 다른 작업을 동시에 진행할 수 있게 해줍니다.
장점: 비동기 처리는 웹 애플리케이션의 성능을 향상시킬 수 있으며, 사용자 경험을 개선하는 데에도 도움이 됩니다. 서버로부터 데이터를 받아오는 동안에도 사용자는 다른 작업을 계속할 수 있습니다.
단점: 비동기 처리는 코드의 복잡성을 증가시킬 수 있으며, 콜백 지옥(callback hell)과 같은 문제를 야기할 수 있습니다. 하지만, Promise나 async/await와 같은 현대적인 자바스크립트 기능을 사용하여 이러한 문제를 해결할 수 있습니다.
동기 처리(Synchronous Processing)
정의: 동기 처리는 현재 실행 중인 작업이 완료될 때까지 다음 작업이 대기하는 방식입니다. 즉, 한 작업이 끝나야만 다음 작업을 시작할 수 있습니다.
장점: 동기 처리는 코드의 흐름을 이해하기 쉽고, 디버깅이 비교적 간단합니다. 작업의 순서가 보장되기 때문에, 예측 가능한 결과를 얻을 수 있습니다.
단점: 동기 처리는 특정 작업이 완료될 때까지 전체 시스템이 멈춰 있어야 하므로, 효율성이 떨어질 수 있습니다. 특히, 네트워크 요청과 같이 시간이 많이 소요되는 작업에서는 사용자 경험을 저하시킬 수 있습니다.
비동기 처리와 동기 처리는 각각의 장단점이 있으며, 상황에 따라 적절히 선택하여 사용하는 것이 중요합니다. 웹 개발에서는 특히 비동기 처리의 중요성이 강조되지만, 동기 처리가 필요한 경우도 있습니다. 프로그래밍을 할 때 이 두 가지 처리 방식의 차이를 잘 이해하고 적용해보세요"