127.0.0.1 - 로컬 컴퓨터)ServerSocket (서버용):
accept() 메서드를 통해 클라이언트의 연결 요청을 수락하고, 실제 통신을 위한 Socket 객체를 생성하여 반환합니다.Socket (클라이언트용 및 통신용):
ServerSocket이 생성해준 객체로, 연결된 클라이언트와 1:1로 데이터를 주고받기 위해 사용됩니다.getInputStream()과 getOutputStream()을 통해 데이터를 읽고 쓰는 스트림을 얻을 수 있습니다.// 간단한 서버 예시
try (ServerSocket serverSocket = new ServerSocket(9090)) {
System.out.println("서버가 연결을 기다립니다...");
Socket clientSocket = serverSocket.accept(); // 클라이언트 연결 대기
System.out.println("클라이언트가 연결되었습니다.");
// ... clientSocket을 이용한 데이터 통신 ...
} catch (IOException e) {
e.printStackTrace();
}
java.time 패키지)Date와 Calendar 클래스는 가변성(mutable), 복잡한 API, 월(month) 계산 오류(0부터 시작) 등 여러 문제점을 가지고 있었습니다. Java 8에서 도입된 java.time 패키지는 이러한 문제들을 해결한 새로운 표준입니다.java.time 패키지의 핵심 특징plusDays(), minusHours() 등 직관적인 메서드 이름을 제공합니다.LocalDate), 시간(LocalTime), 날짜와 시간(LocalDateTime), 시간대(ZonedDateTime) 등 역할이 명확하게 분리되어 있습니다.| 클래스 | 설명 | 예시 |
|---|---|---|
LocalDate | 날짜 정보만 표현 (e.g., 2026-01-03) | LocalDate.now(), LocalDate.of(2026, 1, 3) |
LocalTime | 시간 정보만 표현 (e.g., 10:30:55) | LocalTime.now(), LocalTime.of(10, 30) |
LocalDateTime | 날짜와 시간을 함께 표현 (e.g., 2026-01-03T10:30:55) | LocalDateTime.now() |
ZonedDateTime | LocalDateTime에 시간대(Timezone) 정보를 포함 | ZonedDateTime.now(ZoneId.of("Asia/Seoul")) |
Period | 날짜 간의 간격 (년, 월, 일) | Period.between(date1, date2) |
Duration | 시간 간의 간격 (시, 분, 초, 나노초) | Duration.between(time1, time2) |
DateTimeFormatter | 날짜/시간 객체를 원하는 형식의 문자열로 포맷팅하거나, 문자열을 파싱 | formatter.format(now), LocalDate.parse(str, formatter) |
@)은 "메타데이터(Metadata)"입니다. 즉, 코드 자체의 일부는 아니지만, 코드에 대한 부가적인 정보를 제공하는 역할을 합니다.@Override, @Deprecated 등 컴파일러가 문법 체크를 하도록 돕습니다.@Getter, @Setter)과 같이 빌드 타임에 코드를 생성합니다.@Controller, @Autowired 등 프로그램 실행 중에 리플렉션을 통해 특정 로직을 수행하도록 정보를 제공합니다. (프레임워크의 핵심)리플렉션은 프로그램이 실행 중에(Runtime) 자기 자신(클래스, 메서드, 필드 등)의 구조를 검사하고, 생성하고, 수정할 수 있는 강력한 기능입니다.
동작 원리:
@Component와 같은 어노테이션이 붙은 클래스들을 찾습니다.@Autowired가 붙은 필드를 찾으면, 리플렉션을 사용하여 해당 필드에 미리 만들어 둔 다른 Bean 객체를 주입(Injection)합니다.결론: 어노테이션은 "표지판"을 붙이는 행위이고, 리플렉션은 런타임에 그 "표지판"을 읽고 특별한 동작을 수행하는 기술입니다. Spring의 DI(의존성 주입)와 AOP(관점 지향 프로그래밍)는 모두 이 리플렉션 기술을 기반으로 동작합니다.
ServerSocket으로 연결을 기다리고, 실제 통신은 Socket을 통해 이루어집니다.java.time 패키지(e.g., LocalDateTime)를 사용해야 합니다. 이 API는 불변성을 보장하여 안전하고 직관적입니다.