← (처음 파일) 📚 전체 맵 01b Lombok·Optional·Generic
Series 01 · Java 기초 · 1/3

JAVA
BASICS

어노테이션 · 클래스 · 인터페이스 · 접근제어자
프로젝트 코드를 읽기 위한 Java 핵심 문법 첫 번째

01a 어노테이션·클래스·접근제어자 01b Lombok·Optional·Generic 01c Lambda·Stream
01 Java 기초 02 Spring 기초 03 웹/통신 04 프로젝트 코드 05 심화 06 Security 07 JVM 08 DI
이 파일의 학습 목적
01a — 왜 여기서 시작하는가?

Spring Boot 프로젝트 코드를 처음 열면 @Service implements private final 같은 Java 문법이 사방에 등장한다. 이것들을 모르면 Spring 코드가 아예 읽히지 않는다. 01a는 프로젝트 코드 전체를 읽기 위한 Java 기초 문법 3가지를 정리한다.

이 파일에서 배울 3가지
  • 어노테이션 — @기호의 의미, 컴파일러·Spring이 읽는 방식
  • 클래스·인터페이스 — implements / extends 차이
  • 접근제어자 — public / private / protected 범위
프로젝트 코드에서 등장 위치
  • · 모든 Controller / Service / Repository 클래스
  • · implements UserDetailsService — 3차
  • · extends OncePerRequestFilter — 2·3차
시리즈 순서: 01a ← 지금 여기 → 01b Lombok·Optional·Generic → 01c Lambda·Stream → 02 Spring 기초 → 03 웹/통신
01 — 어노테이션(@)이란?
코드에 '메모'를 붙이는 것 — 컴파일러와 Spring이 이 메모를 읽고 자동 처리
📦 한 줄 정의 Definition

어노테이션은 코드에 붙이는 메타데이터(메모)입니다.
@기호로 시작하며, 컴파일러나 Spring이 이 메모를 읽고 자동으로 처리해줍니다.

📮 비유 — 택배 상자 스티커
상자에 '깨지기 쉬움' 스티커 → 택배기사가 조심히 다룸
상자에 '냉장 보관' 스티커 → 냉장차로 운반

@Controller 붙이면 → Spring이 '이건 컨트롤러구나' 인식
@Transactional 붙이면 → Spring이 '트랜잭션 자동 처리해야지' 인식
@GetMapping 붙이면 → Spring이 'GET 요청 오면 이 메서드 실행' 인식
❌ 어노테이션 없이
// Spring이 이 클래스가 뭔지 몰라서
// 아무것도 안 해줌
public class UserController {
public String login() { ... }
}
✅ 어노테이션 사용
@Controller // 컨트롤러야
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() { ... }
}
어노테이션의미누가 처리
@Controller이 클래스는 웹 컨트롤러Spring MVC
@Service이 클래스는 비즈니스 로직Spring
@Repository이 클래스는 DB 접근Spring + JPA
@ComponentSpring이 관리하는 빈Spring
@TransactionalDB 트랜잭션 자동 처리Spring AOP
@GetMappingGET 요청 처리Spring MVC
@EntityDB 테이블과 매핑JPA
02 — 클래스와 인터페이스
클래스 = 설계도 / 인터페이스 = 반드시 해야 할 일 목록
🏗️ 클래스 vs 인터페이스 Core
🚗 비유 — 자동차
클래스 = 자동차 설계도 → 엔진, 바퀴, 색상 등 모든 것이 구체적으로 정의됨
인터페이스 = 자동차 법적 규격 → '안전벨트 있어야 함', '브레이크 있어야 함' 규칙만 정의
→ 어떻게 만드는지는 각 제조사가 알아서
Java — 인터페이스 vs 클래스 구조
// 인터페이스: 뭘 해야 하는지만 정의 (구현 없음)
public interface UserDetailsService {
UserDetails loadUserByUsername(String username); // 반드시 구현해야 함
}

// 클래스: 인터페이스를 implements 해서 실제 구현
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) {
// 실제 구현: DB에서 유저 조회
return userRepository.findByUsername(username)...
}
}

// extends: 부모 클래스를 상속 (기능을 물려받음)
public class JwtAuthenticationFilter extends OncePerRequestFilter {
// OncePerRequestFilter의 기능을 물려받으면서 doFilterInternal만 구현
@Override
protected void doFilterInternal(...) { ... }
}
키워드의미프로젝트 예시
implements인터페이스 구현 (규칙 따름)implements UserDetailsService
extends클래스 상속 (기능 물려받음)extends OncePerRequestFilter
@Override부모/인터페이스 메서드 재정의@Override doFilterInternal()
interface규칙만 정의하는 설계 틀interface UserDetailsService
abstract일부만 구현된 중간 클래스abstract class BaseFilter
💡 왜 인터페이스를 쓰는가?
Spring Security가 UserDetailsService 인터페이스를 사용하기 때문에,
우리가 CustomUserDetailsService로 구현하면 Spring Security가 자동으로 찾아서 사용함.
규칙(인터페이스)을 맞추면 Spring이 알아서 연결해줌
03 — 접근제어자
다른 클래스에서 이 코드에 접근할 수 있는지 결정 — public / private / protected
🏢 접근 범위 4단계 Access
🏢 비유 — 건물 출입 등급
public = 누구나 출입 가능 (정문, 로비)
private = 본인만 출입 가능 (개인 사무실)
protected = 같은 가족(상속 관계)만 출입 가능
(없음) = 같은 건물(패키지)만 출입 가능
Java — UserService.java 접근제어자 실제 예시
@Service
public class UserService {

// public: 다른 클래스(UserController)에서 호출 가능
public void register(UserDto userDto) {
String encoded = encodePassword(userDto.getPassword());
...
}

// private: 이 클래스 안에서만 사용
private String encodePassword(String raw) {
return bCryptPasswordEncoder.encode(raw);
}
}
Java — 접근 가능/불가 확인
// UserController에서:
userService.register(userDto); // ✅ public이라 가능
userService.encodePassword("1234"); // ❌ private이라 불가 → 컴파일 에러
접근제어자접근 가능 범위주로 쓰는 곳
public어디서든 접근 가능Controller 메서드, Service 메서드
private같은 클래스 안에서만내부 헬퍼 메서드, 비밀번호 처리
protected같은 패키지 + 상속 관계doFilterInternal() 등 상속 메서드
(없음)같은 패키지 안에서만잘 안 씀
💡 왜 private를 쓰는가?
비밀번호 인코딩 같은 내부 로직은 외부에서 직접 호출하면 안 됨.
private으로 막아두면 → 실수로 외부에서 호출할 수 없음 → 안전한 코드
정리 — 핵심 3가지
이 3가지가 프로젝트 코드 전체에서 반복됨
📌
어노테이션
@기호로 코드에 메모.
Spring·JPA·Lombok이 읽고 자동 처리.
직접 코드 안 써도 됨.
🏗️
클래스·인터페이스
클래스 = 구체적 설계도.
인터페이스 = 규칙 목록.
implements/extends로 연결.
🔒
접근제어자
public = 누구나.
private = 나만.
protected = 상속 관계만.
← (처음 파일) 📚 전체 맵 01b Lombok·Optional·Generic