자바 main 메서드와 Spring 어노테이션 [CS 면접 박살내기]
자바 main 메서드와 Spring 어노테이션
자바를 처음 배울 때 가장 헷갈렸던 부분이 바로 main 메서드의 역할이었다. 그런데 Spring을 배우면서 main 메서드에 붙는 어노테이션들이 뭔지, 왜 붙는지 궁금해졌다. 이번에는 자바의 main 메서드부터 Spring의 어노테이션까지 차근차근 알아보자.
자바에서 main 메서드란?
main 메서드는 자바 애플리케이션이 시작되는 진입점(entry point)이다.
자바 프로그램을 실행하면 JVM이 가장 먼저 호출하는 메서드가 바로 이 main이다.
즉, 우리가 작성한 코드가 JVM에 의해 실행되기 위한 시작 지점이다.
메서드 시그니처
1
public static void main(String[] args)
각 키워드의 의미는 다음과 같다:
| 키워드 | 의미 |
|---|---|
public | JVM이 어디서든 접근 가능해야 하므로 public |
static | 객체 생성 없이 클래스만으로 실행 가능해야 하므로 static |
void | 반환값이 없다는 뜻 (시작점이므로 아무것도 반환 안 함) |
main | JVM이 약속한 이름. 정확히 이 이름이어야 실행됨 |
String[] args | 명령줄 인자를 받기 위한 배열 (필요 없으면 안 써도 됨, 하지만 선언은 필수) |
기본 예시 코드
1
2
3
4
5
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Spring에서의 main 메서드
그런데 Spring을 사용할 때는 main 메서드가 조금 다르다. Spring Boot 애플리케이션에서는 main 메서드에 특별한 어노테이션들이 붙는다.
Spring Boot의 main 메서드
여기서 @SpringBootApplication 어노테이션이 핵심이다. 이 어노테이션 하나로 Spring Boot의 모든 기능을 활성화할 수 있다.
@SpringBootApplication의 역할
@SpringBootApplication은 사실 여러 어노테이션을 합친 것이다:
1. @SpringBootConfiguration
@Configuration의 특별한 버전- Spring의 설정 클래스임을 나타냄
@Bean어노테이션을 사용해서 빈을 정의할 수 있음
2. @EnableAutoConfiguration
- Spring Boot의 자동 설정 기능을 활성화
- 클래스패스에 있는 라이브러리들을 보고 자동으로 설정을 구성
- 예:
spring-boot-starter-web이 있으면 자동으로 웹 서버 설정
3. @ComponentScan
@Component,@Service,@Repository,@Controller등의 어노테이션이 붙은 클래스들을 자동으로 스캔해서 빈으로 등록- 기본적으로 main 메서드가 있는 패키지부터 하위 패키지까지 스캔
실제 Spring Boot 애플리케이션 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
@Service
public class HelloService {
public String getMessage() {
return "Hello from Service!";
}
}
SpringApplication.run()의 역할
1
SpringApplication.run(Application.class, args);
이 메서드가 하는 일들:
- Spring 컨테이너 생성
- 자동 설정 로드 (
@EnableAutoConfiguration) - 컴포넌트 스캔 (
@ComponentScan) - 웹 서버 시작 (웹 애플리케이션인 경우)
- 애플리케이션 실행
다른 Spring 어노테이션들
@Configuration
1
2
3
4
5
6
7
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
- Spring의 설정 클래스임을 나타냄
@Bean어노테이션으로 빈을 정의할 수 있음
@Component
1
2
3
4
@Component
public class MyComponent {
// ...
}
- Spring이 관리하는 컴포넌트임을 나타냄
- 자동으로 빈으로 등록됨
@Service, @Repository, @Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class UserService {
// ...
}
@Repository
public class UserRepository {
// ...
}
@Controller
public class UserController {
// ...
}
- 각각의 역할에 맞는 어노테이션
- 모두
@Component의 특별한 버전 - 자동으로 빈으로 등록됨
주의할 점
main메서드가 없으면 자바 애플리케이션은 실행되지 않음- 정확한 시그니처가 아니면
main method not found에러 발생 String[] args는 명령어 실행 시 인자를 받을 수 있는 수단 (예:java MyApp hello world)- Spring Boot에서는
@SpringBootApplication이 붙은 클래스의 main 메서드가 진입점 @ComponentScan의 범위를 잘못 설정하면 빈이 등록되지 않을 수 있음
면접용 요약
“main 메서드는 JVM이 프로그램을 시작할 때 가장 먼저 호출하는 진입점이며, Spring Boot에서는 @SpringBootApplication 어노테이션이 붙은 클래스의 main 메서드가 애플리케이션의 시작점이 된다. @SpringBootApplication은 @Configuration, @EnableAutoConfiguration, @ComponentScan을 합친 어노테이션으로, 자동 설정과 컴포넌트 스캔을 통해 Spring 컨테이너를 구성한다.”




