개발자상식 <백엔드 개발자> (9)
[책리뷰 & Book review]
알고리즘, 검색 관련 질문. ex.(이진트리에 대해 설명해 보시오)
물론이죠, 이진 트리에 대한 설명과 이와 관련된 자바 코드를 설명드리겠습니다.
이진트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가지는 트리 형태의 자료구조입니다. 이진트리는 루트 노드와 루트 노드의 왼쪽 서브 트리, 오른쪽 서브 트리로 구성됩니다.
이진트리를 Java로 구현하는 방법을 보겠습니다. 먼저, 노드 클래스를 생성해야 합니다. 각 노드는 데이터, 왼쪽 자식 노드, 오른쪽 자식 노드를 가집니다.
java
class Node {
int data;
Node left, right;
Node(int item) {
data = item;
left = right = null;
}
}
이후, 이진 트리 클래스를 생성하고 루트 노드를 정의합니다.
java
class BinaryTree {
Node root;
BinaryTree(int key) {
root = new Node(key);
}
BinaryTree() {
root = null;
}
}
이제 이진 트리에 노드를 추가할 수 있습니다. 예를 들어, 다음과 같이 이진 트리를 생성할 수 있습니다.
java
public class Main {
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
/* create root */
tree.root = new Node(1);
/* following is the tree after above statement
1
/ \
null null */
tree.root.left = new Node(2);
tree.root.right = new Node(3);
/* 2 and 3 become left and right children of 1
1
/ \
2 3
/ \ / \
null null null null */
tree.root.left.left = new Node(4);
/* 4 becomes left child of 2
1
/ \
2 3
/ \ / \
4 null null null
/ \
null null
*/
}
}
이 코드는 다음과 같은 이진 트리를 생성합니다:
1
/ \
2 3
/
4
이진트리는 데이터의 저장 및 검색 등 다양한 알고리즘에서 사용됩니다. 이진 검색 트리(Binary Search Tree)는 이진트리의 한 종류로 데이터를 효율적으로 검색할 수 있도록 도와줍니다.
-이진트리의 구성 요소
Tomcat을 쓰는 이유?
Spring과 관련된 기본적인 구조를 설명
1. Java 스펙(SPEC)
├── J2EE (Java 2 Platform, Enterprise Edition)
│ ├── EJB (Enterprise JavaBeans)
│ ├── RMI (Remote Method Invocation)
│ └── etc.
├── J2SE (Java 2 Platform, Standard Edition)
│ ├── Servlet
│ ├── JSP (JavaServer Pages)
│ └── etc.
└── J2ME (Java 2 Platform, Micro Edition)
2. WAS (Web Application Server)
├── WebLogic
├── JEUS
├── JBoss
├── TomEE (Tomcat + Java EE)
└── etc.
3. Servlet Container (J2SE 스펙을 만족)
├── Tomcat
├── Jetty
└── etc.
4. Spring Framework
├── Spring MVC
├── Spring Data
├── Spring Security
└── etc.
5. Spring Boot
├── 내장 WAS
│ ├── Tomcat (Embedded)
│ ├── Jetty (Embedded)
│ └── Undertow (Embedded)
└── Spring Framework 기능
여기서 Spring Framework는 자체적으로 J2EE 스펙을 필요로 하지 않고, Servlet Container만을 이용해 경량화된 J2EE처럼 사용이 가능합니다. 따라서 무거운 WAS를 설치할 필요 없이, J2SE 스펙을 만족하는 Servlet Container만을 이용해 개발이 가능합니다.
Spring Boot는 Spring Framework 기능을 포함하며, 추가적으로 내장 WAS 기능을 제공합니다. 따라서 별도의 외장 WAS 설치 없이도 웹 애플리케이션을 구동할 수 있습니다. 이렇게 내장된 WAS는 Tomcat, Jetty, Undertow 등을 선택해 사용할 수 있으며, 이들은 모두 J2SE 스펙을 만족하는 Servlet Container입니다.
springboot와 spring의 차이는 무엇인가?
Spring Framework와 Spring Boot 사이의 차이점을 설명하기 위해 '규모'라는 개념을 사용한 글이 많은데, 이는 대형 프로젝트에서 개발자가 직접 더 많은 제어를 원하거나 복잡한 설정이 필요한 경우를 나타냅니다. 외장 WAS를 사용하는 경우, 보다 세밀한 설정이 가능하며, 더 많은 자원을 활용하거나, 특정 WAS의 고유 기능을 사용할 수 있습니다.
1. Spring Framework + 외장 WAS
├── 세밀한 설정 가능
├── 특정 WAS 고유 기능 사용 가능
├── 더 많은 자원 활용
└── etc.
2. Spring Boot (내장 WAS)
├── 간편한 설정
├── 빠른 개발 및 배포
├── 자동 설정
└── etc.
Java 코드로는 이 둘 사이의 차이를 명확하게 보여주는 것은 어렵습니다.
그 이유는 Spring Framework와 Spring Boot 모두 동일한 Java 코드를 사용하며, 차이점은 주로 설정과 관련이 있기 때문입니다. 그러나, 아래는 Spring Boot의 Auto-Configuration 기능을 보여주는 간단한 예제 코드입니다:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Spring Boot는 이 어노테이션 하나로 Spring MVC, JPA 등을 자동 설정합니다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
반면, Spring Framework에서 동일한 기능을 설정하려면 XML 파일이나 Java Config 클래스에서 수동으로 설정해야 합니다. 이는 복잡도를 증가시키지만, 동시에 더 많은 제어를 가능하게 합니다.
대형 기업에서 Spring Framework를 선택하는 이유는 여러 가지가 있습니다.
세밀한 설정 가능: 복잡한 비즈니스 요구사항을 충족시키기 위해 세부 설정이 필요할 수 있습니다. 이 경우 Spring Framework를 사용하면 WAS의 세부 설정을 자유롭게 조정할 수 있습니다.
성능 최적화: 대규모 프로젝트에서는 성능 최적화가 중요합니다. 별도의 WAS를 사용하면, WAS 자체의 성능 튜닝이 가능하므로 더 효율적인 시스템 운영이 가능합니다.
기존 인프라 활용: 이미 외부 WAS를 사용하는 기존 인프라가 있을 경우, Spring Framework를 그대로 사용하면 기존 인프라를 계속 활용할 수 있습니다.
Spring Boot를 사용하면서 대규모 프로젝트를 진행할 때 생길 수 있는 문제점은 다음과 같습니다:
세밀한 설정 제한: Spring Boot는 개발의 편의성을 위해 많은 것들을 자동으로 설정해 주지만, 때로는 이러한 설정이 세밀한 조정을 필요로 하는 상황에서 제한적일 수 있습니다.
내장 WAS의 성능 한계: Spring Boot에서 기본으로 제공하는 내장 WAS(Tomcat, Jetty, Undertow 등)는 일반적으로 소규모에서 중규모 프로젝트에 적합합니다. 하지만 대규모 트래픽을 처리하는 데는 한계가 있을 수 있습니다.
WAS 튜닝의 제한: Spring Boot의 내장 WAS는 외부 WAS에 비해 성능 튜닝이 제한적입니다. 대규모 프로젝트에서는 WAS의 세밀한 튜닝이 필요한 경우가 많습니다.
이런 이유로, 대형 기업은 종종 복잡한 요구사항과 성능 튜닝이 가능한 Spring Framework와 외장 WAS를 선택합니다. 하지만 이것은 모든 경우에 해당하는 것은 아니며, 프로젝트의 요구사항과 상황에 따라 다릅니다. 필요에 따라 Spring Boot를 사용하여 대규모 애플리케이션을 성공적으로 구축하고 운영하는 경우도 많습니다.
세밀한 튜닝에 대한 부분
세밀한 튜닝이 필요한 경우에는 주로 성능 최적화 및 리소스 관리와 관련된 요소들입니다.
예를 들어,
스레드 풀 설정: WAS는 크게 Worker 쓰레드와 Accepter 쓰레드로 나눌 수 있습니다. 이들의 쓰레드 풀 사이즈를 조정하여 성능을 최적화할 수 있습니다.
세션 관리: 세션 저장소 위치, 세션 타임아웃 설정 등 세션 관리에 대한 세밀한 설정이 가능합니다.
커넥션 풀 설정: 데이터베이스 연결에 사용되는 커넥션 풀의 사이즈, 대기 시간, 검증 쿼리 등을 설정할 수 있습니다.
텍스트 그림으로 표현하면 다음과 같습니다:
세밀한 튜닝 필요 요소
├── 쓰레드 풀 설정
├── 세션 관리
└── 커넥션 풀 설정
Java 코드로는 아래와 같이 설정할 수 있습니다. (Tomcat의 경우)
java
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfig {
@Bean
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("cohttp://m.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("user");
ds.setPassword("password");
// 커넥션 풀 설정
ds.setInitialSize(5);
ds.setMaxActive(10);
ds.setMaxIdle(5);
ds.setMinIdle(2);
ds.setValidationQuery("SELECT 1");
return ds;
}
}
위 코드는 Spring Framework에서 사용될 수 있는 설정 예시로, Spring Boot에서는 이러한 세부 설정을 자동으로 해주지만, 경우에 따라서는 이 설정이 제한적일 수 있습니다. 때문에 대규모 시스템에서는 이런 세부 설정들을 개발자가 직접 제어할 수 있는 Spring Framework와 외부 WAS를 선택하는 경우가 많습니다.
외장 WAS와 내장(embed) WAS 가 가지는 차이
Java 2 Platform, Standard Edition (J2SE) 스펙에는 다음과 같은 기술들이 포함되어 있습니다:
Core API (기본 입력/출력, 스레딩, 네트워킹, 보안 등)
GUI 컴포넌트 (AWT, Swing)
JDBC (Java Database Connectivity)
RMI (Remote Method Invocation)
JavaBeans
JFC (Java Foundation Classes)
Servlet
JSP (JavaServer Pages)
등등
그리고 Spring과 Spring Boot의 차이점을 텍스트 그림으로 나타내면 다음과 같습니다:
1. Spring Framework
├── Core Container (Core, Beans, Context, Expression Language)
├── Data Access/Integration (JDBC, ORM, OXM, JMS, Transaction)
├── Web (Servlet, Websocket, Portlet)
├── AOP (Aspect Oriented Programming)
├── Instrumentation
└── Test
2. Spring Boot
├── Spring Framework
├── Auto Configuration
├── Embedded Servers (Tomcat, Jetty, Undertow)
└── Spring Boot Actuator (Application features, like health check, metrics)
Spring Framework는 웹 애플리케이션 개발을 위한 핵심 기능들을 제공합니다.
하지만 설정이 복잡하고, 서버에 배포하기 위해서는 별도의 WAS가 필요합니다.
반면, Spring Boot는 Spring Framework 기능을 포함하고 있으며, 추가적으로 Auto Configuration, 내장 서버, 애플리케이션 모니터링 등을 제공하여 개발을 더욱 쉽고 편리하게 해 줍니다. 또한 내장 서버 기능 덕분에 별도의 외장 WAS 없이도 웹 애플리케이션을 실행할 수 있습니다. 이로써 개발자들은 인프라 설정보다는 비즈니스 로직 구현에 더 집중할 수 있게 되었습니다.
"풀 사이즈 최적화가 Spring Boot에서는 Spring보다 더 크게 작용한다"는 표현은 정확하지 않습니다. 사실, 커넥션 풀 사이즈의 최적화는 어떤 프레임워크를 사용하든 중요합니다. 이는 DB와의 연결 수를 제어하고, 자원을 효율적으로 사용하며, 시스템 부하를 관리하는 데 도움이 됩니다.
Spring Framework와 Spring Boot의 차이는, Spring Boot가 '자동 설정' 기능을 가지고 있어 초기 설정을 자동으로 해준다는 점입니다. 이는 개발자가 직접 모든 설정을 해줘야 하는 Spring Framework와 비교했을 때 개발의 편의성을 높여줍니다. 하지만 이런 자동 설정이 세밀한 제어를 어렵게 만들 수도 있습니다.
예를 들어, Spring Boot에서는 HikariCP를 기본 커넥션 풀로 사용하고, 이의 기본 설정을 그대로 따릅니다. 개발자가 별도의 설정을 하지 않으면, HikariCP의 기본 설정대로 동작하게 됩니다. 이는 소규모에서 중규모 애플리케이션에서는 충분히 효율적일 수 있지만, 대규모 애플리케이션에서는 세밀한 튜닝이 필요할 수 있습니다.
따라서, "풀 사이즈 최적화가 Spring Boot에서는 Spring보다 더 크게 작용한다"는 표현보다는, "Spring Boot에서는 자동 설정 때문에 세밀한 튜닝이 어렵다"는 표현이 더 정확하겠습니다.
J2SE 스펙 이란?
위의 내용을 기반으로 구조를 텍스트 그림으로 표현하면 다음과 같습니다:
1. 외장 WAS (Web Application Server)
├── Virtual Host 기능
├── JNDI 지원
├── 여러 서비스 운영 가능
└── etc.
2. Spring Boot
├── 내장 WAS (Tomcat, Jetty, Undertow)
├── Auto Configuration
├── Spring Cloud Config
└── etc.
3. Spring Boot + 외장 WAS
├── 외장 WAS 기능
├── Spring Boot 기능
└── etc.
Java 코드로 Spring Boot를 사용하여 외부 properties를 읽어오는 예제는 다음과 같습니다:
java
// application.properties 파일에 외부 URL을 설정합니다.
// external.api.url=http://api.example.com
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ExternalApiProperties {
@Value("${external.api.url}")
private String apiUrl;
public String getApiUrl() {
return apiUrl;
}
}
위의 코드에서 @Value 어노테이션은 Spring Framework에서 제공하는 기능으로, properties 파일의 값을 읽어와 해당 필드에 할당해 줍니다. 이렇게 하면 properties 파일의 값을 Java 코드에서 사용할 수 있습니다.
또한, Spring Boot를 외장 WAS에 배포하는 방법은 다음과 같습니다:
pom.xml 또는 build.gradle 파일을 수정하여 WAR 파일로 패키징 하도록 설정합니다.
xml
<!-- pom.xml -->
<packaging>war</packaging>
SpringBootApplication 클래스에 SpringBootServletInitializer를 상속받도록 수정합니다.
java
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
WAR 파일을 생성하고 원하는 외장 WAS에 배포합니다.
이렇게 하면 Spring Boot 애플리케이션을 외장 WAS에 배포하여 사용할 수 있습니다.
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자 되는 법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프런트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할 말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
개발자상식 <백엔드 개발자> (11)[책리뷰 & Book review] (0) | 2024.01.23 |
---|---|
개발자상식 <백엔드 개발자> (10)[책리뷰 & Book review] (1) | 2024.01.23 |
개발자상식 <백엔드 개발자> (8)[책리뷰 & Book review] (0) | 2024.01.15 |
개발자상식 <백엔드 개발자> (7)[책리뷰 & Book review] (1) | 2024.01.15 |
댓글