목차
Spring은 엔터프라이즈 레벨의 애플리케이션을 구축하기 위해 널리 사용되는 자바 프레임워크 중 하나입니다. 다음은 Spring 인터뷰를 준비하는 데 도움이 될 50개의 주요 질문과 답변입니다.
1. Spring 프레임워크란 무엇인가요?
답변: Spring 프레임워크는 자바 기반의 엔터프라이즈 애플리케이션을 구축하는 데 사용되는 강력하고 기능이 풍부하며 유연한 프레임워크입니다. 자바 애플리케이션 개발을 위한 포괄적인 인프라 지원을 제공합니다. Spring 프레임워크의 핵심 기능은 모든 자바 애플리케이션을 만드는 데 사용할 수 있으며, Java EE(Enterprise Edition) 플랫폼 위에 웹 애플리케이션을 구축할 수 있는 확장 기능도 제공합니다.
2. Spring 프레임워크를 사용하는 장점은 무엇인가요?
답변:
- 경량성: Spring은 크기와 투명성(Transparency) 측면에서 경량입니다.
- 제어의 역전(Inversion of Control, IoC): Spring은 IoC를 사용하여 객체의 생명주기와 종속성을 관리합니다.
- 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP): Spring은 로깅, 보안 등의 횡단 관심사를 분리하기 위해 AOP를 지원합니다.
- 트랜잭션 관리: Spring은 포괄적인 트랜잭션 관리 인터페이스를 제공합니다.
- MVC 프레임워크: Spring은 웹 애플리케이션을 구축하기 위한 강력한 MVC 프레임워크를 제공합니다.
- 통합(Integration): Spring은 Hibernate, JPA, EJB 등 다양한 기술과 쉽게 통합됩니다.
3. Spring 프레임워크의 핵심 모듈은 무엇인가요?
답변: Spring 프레임워크의 핵심 모듈은 다음과 같습니다:
- Spring Core: IoC와 의존성 주입 기능을 제공합니다.
- Spring AOP: 관점 지향 프로그래밍 지원을 제공합니다.
- Spring ORM: Hibernate, JPA 등의 ORM 프레임워크와의 통합을 지원합니다.
- Spring DAO: 데이터베이스 상호작용을 간소화하는 JDBC 추상화 계층을 제공합니다.
- Spring Context: Spring 애플리케이션에 대한 컨텍스트 정보를 제공합니다.
- Spring Web: 웹 지향 통합 기능을 제공합니다.
- Spring MVC: Model-View-Controller 아키텍처 및 구성 요소를 제공합니다.
4. 제어의 역전(Inversion of Control, IoC)이란 무엇인가요?
답변: 제어의 역전(IoC)은 객체 생성과 종속성 관리를 애플리케이션 코드에서 컨테이너나 프레임워크로 넘기는 설계 원칙입니다. Spring에서는 IoC가 의존성 주입(Dependency Injection, DI)을 통해 구현됩니다.
5. 의존성 주입(Dependency Injection, DI)이란 무엇인가요?
답변: 의존성 주입(DI)은 객체의 종속성을 객체 자신이 아닌 외부 엔티티(일반적으로 프레임워크)가 주입하는 기술입니다. 이를 통해 느슨한 결합 코드를 작성할 수 있으며 테스트 용이성을 높일 수 있습니다.
public class Car {
private Engine engine;
// 생성자 기반 DI
public Car(Engine engine) {
this.engine = engine;
}
// Setter 기반 DI
public void setEngine(Engine engine) {
this.engine = engine;
}
}
6. Spring에서 의존성 주입의 종류는 무엇인가요?
답변:
- 생성자 주입: 생성자를 통해 종속성을 제공합니다.
- 세터 주입: Setter 메서드를 통해 종속성을 제공합니다.
- 필드 주입: 종속성이 필드에 직접 주입됩니다(테스트 및 유지보수 문제로 인해 권장되지 않음).
7. Spring Bean이란 무엇인가요?
답변: Spring Bean은 Spring IoC 컨테이너에 의해 인스턴스화되고 구성되며 관리되는 객체입니다. Bean은 Spring 애플리케이션의 구성 요소이며, Spring 설정 파일에 정의되거나 @Component, @Service, @Repository, @Controller 등의 애노테이션으로 표시됩니다.
8. Spring Bean을 정의하는 방법은 무엇인가요?
답변: Spring Bean은 다음과 같은 방법으로 정의할 수 있습니다:
- XML 설정:
<bean id="myBean" class="com.example.MyBean"/>
- 자바 기반 설정:
@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }
- 애노테이션:
@Component public class MyBean { }
9. Spring Bean 생명주기는 어떻게 되나요?
답변: Spring Bean의 생명주기는 다음과 같은 단계로 구성됩니다:
- 인스턴스화: 컨테이너가 Bean 인스턴스를 생성합니다.
- 속성 설정: 컨테이너가 Bean의 속성을 설정합니다.
- BeanNameAware 및 BeanFactoryAware 콜백: Bean은 자신의 이름과 소유 팩토리에 접근할 수 있습니다.
- 초기화 전 BeanPostProcessor: Bean 초기화 메서드가 호출되기 전입니다.
- InitializingBean 인터페이스 및 사용자 정의 초기화 메서드: afterPropertiesSet 메서드 또는 사용자 정의 초기화 메서드가 호출됩니다.
- 초기화 후 BeanPostProcessor: Bean 초기화 메서드가 호출된 후입니다.
- Bean 사용 준비 완료: Bean이 완전히 초기화되어 사용 준비가 완료되었습니다.
- DisposableBean 인터페이스 및 사용자 정의 소멸 메서드: Bean이 소멸될 때 destroy 메서드 또는 사용자 정의 소멸 메서드가 호출됩니다.
10. @Component, @Service, @Repository, @Controller 애노테이션의 차이점은 무엇인가요?
답변:
- @Component: Spring이 관리하는 모든 구성 요소에 대한 일반적인 스테레오타입 애노테이션입니다.
- @Service: 서비스 레이어 구성 요소를 위한 @Component의 특수화입니다.
- @Repository: DAO(Data Access Object) 구성 요소를 위한 @Component의 특수화로, 예외 번역 등의 추가 기능을 제공합니다.
- @Controller: 웹 컨트롤러 구성 요소를 위한 @Component의 특수화입니다.
11. Spring Boot란 무엇인가요?
답변: Spring Boot는 Spring 프레임워크 위에 구축된 프로젝트로, 제품 단계(Production Ready) 의 애플리케이션 개발을 간소화합니다. Spring Boot는 임베디드 서버, 보안, 메트릭스, 외부화된 설정과 같은 다양한 비기능적 기능을 제공하여 개발자가 최소한의 설정으로 애플리케이션을 빠르게 구축할 수 있도록 돕습니다.
12. Spring Boot를 사용하는 장점은 무엇인가요?
답변:
- 설정보다 관례(Convention over Configuration): 설정 필요성을 최소화합니다.
- 독립 실행형 애플리케이션: Tomcat, Jetty, Undertow와 같은 임베디드 서버를 사용하여 독립 실행형 애플리케이션을 만들 수 있습니다.
- 제품 단계(Production Ready) 기능: 건강 체크, 메트릭스, 외부화된 설정과 같은 기능을 제공합니다.
- 간편한 의존성 관리: 스타터를 사용하여 의존성 관리를 간소화합니다.
13. Spring Boot 애플리케이션을 만드는 방법은 무엇인가요?
답변: Spring Boot 애플리케이션은 Spring Initializr를 사용하여 만들 수 있으며, 이는 start.spring.io에서 사용할 수 있습니다. 또한 필요한 의존성을 pom.xml 또는 build.gradle 파일에 포함시키고, 메인 클래스를 @SpringBootApplication으로 어노테이트하여 수동으로 생성할 수도 있습니다.
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
14. @SpringBootApplication 애노테이션이란 무엇인가요?
답변: @SpringBootApplication 애노테이션은 다음 세 가지 애노테이션의 조합입니다:
- @Configuration: 이 클래스가 Spring IoC 컨테이너에 의해 Bean 정의의 소스로 사용될 수 있음을 나타냅니다.
- @EnableAutoConfiguration: 클래스 경로 설정, 다른 Bean 및 다양한 속성 설정을 기반으로 Spring Boot가 자동으로 Bean을 추가하기 시작하도록 지시합니다.
- @ComponentScan: 웹 컨트롤러 클래스 및 기타 구성 요소를 자동으로 검색하고 Spring 애플리케이션 컨텍스트에서 Bean으로 등록할 수 있도록 구성 요소 스캐닝을 활성화합니다.
15. Spring Data JPA란 무엇인가요?
답변: Spring Data JPA는 더 큰 Spring Data 가족의 일부입니다. 데이터 액세스 계층 개발을 간소화하여 데이터 액세스를 위한 반복적인 코드를 줄입니다. JPA(Java Persistence API)를 사용하여 데이터 액세스를 수행하며, CRUD 작업을 위한 인터페이스인 리포지토리를 제공합니다.
16. Spring Repository란 무엇인가요?
답변: Spring Repository는 데이터 액세스 기술에 대한 추상화입니다. Spring Data JPA의 일부이며 @Repository로 애노테이트됩니다. 리포지토리는 데이터베이스와 상호작용하기 위한 CRUD 작업 및 쿼리 메서드를 제공합니다.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
}
17. CrudRepository와 JpaRepository의 차이점은 무엇인가요?
답변:
- CrudRepository: CRUD 작업을 제공합니다.
- JpaRepository: CrudRepository와 PagingAndSortingRepository를 확장합니다. JPA와 관련된 추가 작업(예: 영속성 컨텍스트 플러싱, 배치에서 레코드 삭제)을 제공합니다.
18. Spring MVC란 무엇인가요?
답변: Spring MVC(Model-View-Controller)는 유연하고 느슨하게 결합된 웹 애플리케이션을 개발할 수 있는 모델-뷰-컨트롤러 아키텍처와 준비된 구성 요소를 제공하는 웹 프레임워크입니다. MVC 패턴은 애플리케이션의 다양한 측면(입력 로직, 비즈니스 로직, UI 로직)을 분리하면서 이러한 요소들 간의 느슨한 결합을 제공합니다.
19. DispatcherServlet이란 무엇인가요?
답변: DispatcherServlet은 Spring MVC 프레임워크에서 프론트 컨트롤러 역할을 합니다. 이 서블릿은 들어오는 요청을 적절한 핸들러로 디스패치하고, 요청을 처리한 후 적절한 응답을 생성하는 책임이 있습니다.
20. Spring AOP에서 Advice의 종류는 무엇인가요?
답변:
- Before Advice: 메서드 실행 전에 실행됩니다.
- After Returning Advice: 메서드가 결과를 반환한 후에 실행됩니다.
- After Throwing Advice: 메서드가 예외를 던진 후에 실행됩니다.
- After (Finally) Advice: 메서드가 완료된 후, 결과와 상관없이 실행됩니다.
- Around Advice: 메서드 실행 전과 후에 실행됩니다.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature().getName());
}
@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("Method returned: " + joinPoint.getSignature().getName());
System.out.println("Result: " + result);
}
}
21. @Transactional 애노테이션이란 무엇인가요?
답변: @Transactional 애노테이션은 Spring에서 선언적으로 트랜잭션을 관리하는 데 사용됩니다. 메서드나 클래스에 적용되어 트랜잭션의 범위를 정의할 수 있습니다.
@Service
public class UserService {
@Transactional
public void createUser(User user) {
// 트랜잭션 코드
}
}
22. Spring Profiles이란 무엇인가요?
답변: Spring Profiles는 애플리케이션 구성의 일부를 분리하여 특정 환경에서만 사용할 수 있도록 하는 방법을 제공합니다. 이는 개발, 테스트, 프로덕션 환경을 위한 다양한 구성을 관리하는 데 특히 유용합니다.
@Profile("dev")
@Configuration
public class DevConfig {
// 개발 환경에 특화된 빈들
}
23. Spring Security란 무엇인가요?
답변: Spring Security는 자바 애플리케이션을 위한 포괄적이고 고도로 커스터마이징 가능한 인증 및 접근 제어 프레임워크입니다. CSRF, 세션 고정 등과 같은 일반적인 보안 위협으로부터 애플리케이션을 보호합니다.
24. Spring Security의 주요 구성 요소는 무엇인가요?
답변:
- 인증(Authentication): 사용자가 인증되었는지 여부를 결정합니다.
- 권한 부여(Authorization): 인증된 사용자가 특정 리소스에 접근할 수 있는지 여부를 결정합니다.
- 서블릿 필터(Servlet Filters): 인증 및 권한 부여를 위한 다양한 필터를 제공합니다.
- 보안 컨텍스트(Security Context): 현재 실행 스레드에 대한 보안 정보를 보유합니다.
25. Spring Boot 애플리케이션에서 보안을 구현하는 방법은 무엇인가요?
답변: Spring Boot 애플리케이션에서 보안을 구현하려면 spring-boot-starter-security 의존성을 추가하고 SecurityConfig 클래스를 구성해야 합니다.
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().permitAll();
}
}
26. @RequestMapping과 @GetMapping의 차이점은 무엇인가요?
답변:
- @RequestMapping: MVC 및 REST 컨트롤러의 핸들러 메서드에 웹 요청을 매핑하는 데 사용됩니다. method 속성을 지정하여 모든 HTTP 메서드를 처리할 수 있습니다.
- @GetMapping: @RequestMapping의 특수 버전으로, @RequestMapping(method = RequestMethod.GET)을 대체합니다.
@RestController
public class MyController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "Hello, World!";
}
@GetMapping("/hi")
public String hi() {
return "Hi, World!";
}
}
27. Spring Bean Scope란 무엇인가요?
답변: Spring Bean의 범위는 Spring 컨텍스트 내에서 해당 Bean의 생명주기와 가시성을 정의합니다. 일반적인 Bean 범위는 다음과 같습니다:
- Singleton: 하나의 인스턴스가 생성되어 공유됩니다.
- Prototype: Bean이 요청될 때마다 새 인스턴스가 생성됩니다.
- Request: HTTP 요청마다 새 인스턴스가 생성됩니다.
- Session: HTTP 세션마다 새 인스턴스가 생성됩니다.
- Global-Session: 글로벌 HTTP 세션마다 새 인스턴스가 생성됩니다(포틀릿 기반 애플리케이션에서 사용).
28. Spring Bean에 대해 프로토타입 범위를 정의하는 방법은 무엇인가요?
답변: @Scope 애노테이션 또는 XML 설정을 사용하여 프로토타입 범위를 정의할 수 있습니다.
@Component
@Scope("prototype")
public class PrototypeBean {
// Bean 정의
}
29. Spring Actuator란 무엇인가요?
답변: Spring Actuator는 Spring Boot의 서브 프로젝트로, 애플리케이션을 모니터링하고 관리할 수 있는 프로덕션 제품 단계(Production Ready)을 제공합니다. 건강 체크, 메트릭스, 정보 등의 엔드포인트를 포함합니다.
30. Spring Boot 애플리케이션에서 Spring Actuator를 활성화하는 방법은 무엇인가요?
답변: Spring Actuator는 프로젝트에 spring-boot-starter-actuator 의존성을 추가하여 활성화할 수 있습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
31. Spring Cloud란 무엇인가요?
답변: Spring Cloud는 개발자가 분산 시스템에서 공통적으로 사용되는 패턴(예: 구성 관리, 서비스 검색, 회로 차단기, 지능형 라우팅, 마이크로 프록시, 제어 버스, 일회용 토큰 등)을 빠르게 구축할 수 있는 도구를 제공합니다.
32. Spring Cloud Config란 무엇인가요?
답변: Spring Cloud Config는 분산 시스템에서 외부화된 구성을 지원하는 서버 및 클라이언트 측 지원을 제공합니다. Config Server를 사용하면 모든 환경에서 애플리케이션에 대한 외부 속성을 중앙에서 관리할 수 있습니다.
33. Spring Boot Starter란 무엇인가요?
답변: Spring Boot Starters는 애플리케이션에 종속성을 추가하는 과정을 간소화하는 의존성 기술자입니다. 사용하기 편리한 종속성 기술자 세트를 제공하여 애플리케이션에 포함할 수 있습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
34. Spring Initializr란 무엇인가요?
답변: Spring Initializr는 Spring 팀이 제공하는 웹 기반 도구로, 새로운 Spring Boot 프로젝트를 부트스트랩할 수 있습니다. 필요한 종속성을 선택하고 프로젝트 구조를 생성하여 zip 파일로 다운로드하거나 IDE로 직접 가져올 수 있습니다.
35. @Controller와 @RestController의 차이점은 무엇인가요?
답변:
- @Controller: 뷰를 반환하는 웹 컨트롤러를 정의하는 데 사용됩니다.
- @RestController: @Controller와 @ResponseBody를 결합한 편리한 애노테이션입니다. RESTful 웹 서비스를 만들고 응답 본문을 직접 반환하는 데 사용됩니다.
@Controller
public class MyController {
@GetMapping("/view")
public String view() {
return "viewName";
}
}
@RestController
public class MyRestController {
@GetMapping("/data")
public String data() {
return "Hello, World!";
}
}
36. @RequestParam 애노테이션이란 무엇인가요?
답변: @RequestParam 애노테이션은 요청 URL에서 쿼리 매개변수, 폼 매개변수 또는 기타 매개변수를 추출하는 데 사용됩니다.
@RestController
public class MyController {
@GetMapping("/greet")
public String greet(@RequestParam(name = "name", defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
}
37. @PathVariable 애노테이션이란 무엇인가요?
답변: @PathVariable 애노테이션은 URI 경로에서 값을 추출하는 데 사용됩니다.
@RestController
public class MyController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String userId) {
return "User ID: " + userId;
}
}
38. Spring Batch란 무엇인가요?
답변: Spring Batch는 배치 처리 — 일련의 작업을 실행하기 위한 프레임워크입니다. 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 스킵, 리소스 관리 등을 포함한 대량 레코드 처리에 필수적인 재사용 가능한 기능을 제공합니다.
39. Spring Boot DevTools란 무엇인가요?
답변: Spring Boot DevTools는 개발 경험을 향상시킬 수 있는 도구 세트입니다. 자동 재시작, 라이브 리로드, 개발용 구성 등의 기능을 포함합니다.
40. @Configuration 애노테이션의 용도는 무엇인가요?
답변: @Configuration 애노테이션은 Spring IoC 컨테이너에서 빈 정의의 소스로 사용할 수 있는 설정 클래스를 정의하는 데 사용됩니다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
41. Spring Integration이란 무엇인가요?
답변: Spring Integration은 엔터프라이즈 통합 패턴에 대한 지원을 제공하는 Spring 프로그래밍 모델의 확장입니다. Spring 기반 애플리케이션 내에서 경량 메시징을 가능하게 하며, 선언적 어댑터를 통해 외부 시스템과의 통합을 지원합니다.
42. Spring AMQP란 무엇인가요?
답변: Spring AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어에 대한 지원을 제공합니다. Spring JMS와 유사하게 메시징을 다루기 위한 추상화 및 공통 API 세트를 제공합니다.
43. @Conditional 애노테이션이란 무엇인가요?
답변: @Conditional 애노테이션은 조건부로 빈을 생성할 수 있게 해줍니다. 빈을 생성해야 하는 조건을 정의하는 데 사용할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
@Conditional(DevEnvironmentCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
public class DevEnvironmentCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return "dev".equals(System.getProperty("env"));
}
}
44. Spring WebFlux란 무엇인가요?
답변: Spring WebFlux는 Spring 5 프레임워크의 일부로, 반응형 프로그래밍을 지원합니다. Reactive Streams API를 사용하여 비동기적이고 논블로킹 방식으로 웹 애플리케이션을 구축할 수 있는 방법을 제공합니다.
45. 반응형 프로그래밍이란 무엇인가요?
답변: 반응형 프로그래밍은 비동기 데이터 스트림과 변화의 전파를 다루는 프로그래밍 패러다임입니다. 이를 통해 개발자는 더 견고하고 반응성이 뛰어난 애플리케이션을 구축할 수 있습니다.
46. Spring WebFlux와 Spring MVC의 차이점은 무엇인가요?
답변:
- Spring MVC: 전통적인 서블릿 API를 기반으로 하며, 블로킹 방식입니다.
- Spring WebFlux: 반응형 프로그래밍 모델을 기반으로 하며, 논블로킹 방식입니다.
47. @RestControllerAdvice의 용도는 무엇인가요?
답변: @RestControllerAdvice 애노테이션은 RESTful 웹 서비스에서 전역적으로 예외를 처리하는 데 사용됩니다. 여러 @ExceptionHandler 메서드를 하나의 공유 구성 요소로 통합할 수 있습니다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
}
48. Spring Retry란 무엇인가요?
답변: Spring Retry는 실패한 작업을 자동으로 다시 호출할 수 있는 기능을 제공합니다. 일시적인 오류를 처리하고 구성 가능한 백오프 정책을 통해 재시도를 수행할 수 있습니다.
49. @Value 애노테이션이란 무엇인가요?
답변: @Value 애노테이션은 속성 파일, 시스템 속성 또는 환경 변수에서 필드에 값을 주입하는 데 사용됩니다.
@Component
public class MyComponent {
@Value("${app.name}")
private String appName;
@Value("#{systemProperties['user.name']}")
private String userName;
}
50. @Async 애노테이션의 용도는 무엇인가요?
답변: @Async 애노테이션은 메서드를 비동기적으로 실행하도록 표시하는 데 사용됩니다. 메서드가 별도의 스레드에서 실행되도록 하여 호출자가 메서드가 완료될 때까지 기다리지 않고 계속 진행할 수 있게 합니다.
@Service
public class MyService {
@Async
public void asyncMethod() {
// 비동기 코드
}
}
이 질문과 답변은 Spring 프레임워크 인터뷰를 준비하는 데 필요한 탄탄한 기초를 제공할 것입니다. 각 주제는 주요 Spring 개념에 대한 지식과 이해를 테스트하고 실제 시나리오에서 어떻게 적용되는지를 다룹니다.
읽어주셔서 감사합니다! 😊
개발 관련 궁금증이나 고민이 있으신가요?
아래 링크를 통해 저에게 바로 문의해 주세요! 쉽고 빠르게 도움 드리겠습니다.
'Development > Code' 카테고리의 다른 글
[스프링 부트] 지금 당장 적용해야 할 25가지 Spring Boot 모범 사례 (0) | 2024.09.02 |
---|---|
[자바] 개발자 필독! 지금 바로 적용할 수 있는 Java 꿀팁 30가지! (2) | 2024.08.27 |
Java Mockito로 테스트 완성도 높이는 4가지 필수 팁 (0) | 2024.08.19 |
Java 22 살펴보기: 외부 함수 및 메모리 API (0) | 2024.08.09 |
React 전문가들이 추천하는 15가지 라이브러리 (1) | 2024.08.06 |