private필드 + getter/setterpublic class User { private String name; // 외부 직접 접근 불가 public String getName() { return name; } public void setName(String name) { this.name = name; } }
Java는 단일 상속만 지원public class Animal { public void eat() { System.out.println("먹는다"); } } public class Dog extends Animal { public void bark() { System.out.println("짖는다"); } } // Dog는 eat()도 쓸 수 있음
오버라이딩(Override)class Animal { public void sound() { System.out.println("..."); } } class Dog extends Animal { @Override public void sound() { // 부모 메서드를 재정의 System.out.println("멍멍"); } }
| 설명 | 관게 | |
|---|---|---|
| Overriding | 부모 메서드를 자식이 재정의 | 상속 관계 |
| Overloading | 같은 이름, 다른 매개변수로 메서드 여러 개 | 같은 클래스 |
Interface나 abstract class로 구현무엇을 하는지만 정의하고 어떻게 하는지는 구현체에 맡김interface Payment { void pay(int amount); // 어떻게 결제하는지는 구현체가 결정 } class KakaoPay implements Payment { public void pay(int amount) { /* 카카오페이 결제 */ } } class NaverPay implements Payment { public void pay(int amount) { /* 네이버페이 결제 */ } }
| abstract 클래스 | Interface | |
|---|---|---|
| 필드 | 일반 변수 가능 | 상수(static final)만 |
| 메서드 | 구현 메서드_ 추상 메서드 혼용 | 추상 메서드만 |
| 상속/구현 | extends 하나만 | implements 여러 개 가능 |
| 목적 | 공통 기능 공유 | 기능 구현 강제 |
| 종류 | 특징 | 사용 이유 |
|---|---|---|
| ArrayList | 배열 기반, 조회 빠름 O(1) | 조회가 많을 때 |
| LinkedList | 노드 연결, 삽입/삭제 빠름 O(1) | 삽입/삭제가 많을 때 |
| 종류 | 특징 | 사용 이유 |
|---|---|---|
| HashMap | 순서 없음, 조회 O(1) | 빠른 검색 |
| LinkedHashMap | 입력 순서 유지 | 순서 중요할 때 |
| TreeMap | Key 정렬됨 | 정렬된 Key 필요할 때 |
| 종류 | 특징 | 사용 이유 |
|---|---|---|
| HashSet | 순서 없음, 조회 O(1) | 중복 제거 |
| TreeSet | 정렬됨 | 정렬된 중복 제거 |
어떤 객체가 필요한지만 선언하면 Spring이 알아서 만들고 주입// IoC 없을 때 (직접 생성) UserService service = new UserService(new UserRepository()); // IoC 있을 때 (Spring이 알아서) @Service public class UserService { ... } // Spring이 알아서 생성·관리
@Service public class UserService { private final UserRepository userRepository; // 생성자 주입 (가장 권장) @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }
@Component,@Service, @Repository, @Controller 어노테이션을 붙이면 Bean으로 등록싱글톤으로 관리됨
public class Singleton { // 1. 딱 하나만 만들어두기 private static Singleton instance = new Singleton(); // 2. 외부에서 new 못하게 막기 private Singleton() { } // 3. 만들어둔 거 가져다 쓰기 public static Singleton getInstance() { return instance; } } // 사용 Singleton a = Singleton.getInstance(); Singleton b = Singleton.getInstance(); // a == b → true (같은 객체)
| 메서드 | 역할 | 예시 |
|---|---|---|
| GET | 조회 | GET/users/1 |
| POST | 생성 | POST/users |
| PUT | 전체 수정 | PUT/users/1 |
| PATCH | 일부 수정 | PATCH/users/1 |
| DELETE | 삭제 | DELETE/users/1 |
@RestController @RequestMapping("/users") public class UserController { // GET /users/1 → 조회 @GetMapping("/{id}") public User getUser(@PathVariable Long id) { } // POST /users → 생성 @PostMapping public User createUser(@RequestBody UserDto dto) { } // PUT /users/1 → 전체 수정 @PutMapping("/{id}") public User updateUser(@PathVariable Long id, @RequestBody UserDto dto) { } // PATCH /users/1 → 일부 수정 @PatchMapping("/{id}") public User patchUser(@PathVariable Long id, @RequestBody UserDto dto) { } // DELETE /users/1 → 삭제 @DeleteMapping("/{id}") public void deleteUser(@PathVariable Long id) { } }
| 코드 | 의미 |
|---|---|
| 200 OK | 성공 |
| 201 Created | 생성 성공 |
| 400 Bad Request | 잘못된 요청(클라이언트 오류) |
| 401 Unauthorized | 인증 필요 |
| 403 Forbidden | 권한 없음 |
| 404 Not Found | 자원 없음 |
| 500 Internal Server Error | 서버 오류 |
Hibernate// SQL 직접 쓰면 String sql = "SELECT * FROM users WHERE id = ?"; // JPA 쓰면 User user = userRepository.findById(id);
fetch join 또는 @EntityGraph 사용@Transactional public void transfer(Long fromId, Long toId, int amount) { Account from = accountRepo.findById(fromId); Account to = accountRepo.findById(toId); from.minus(amount); to.plus(amount); // 정상이면 자동 커밋, 예외 나면 자동 롤백 }
// 모든 예외에서 롤백하려면 @Transactional(rollbackFor = Exception.class)
// AOP 없을 때 → 모든 메서드에 반복 public void createUser() { log.info("시작"); // 로깅 checkAuth(); // 보안 connection.begin(); // 트랜잭션 // 핵심 로직 userRepository.save(user); connection.commit(); // 트랜잭션 log.info("종료"); // 로깅 } // AOP 있을 때 → 핵심 로직만 @Transactional @LogExecutionTime public void createUser() { userRepository.save(user); // 핵심 로직만 }
| 용어 | 설명 | 예시 |
|---|---|---|
| Aspect | 부가 기능 모듈 전체 | 트랜잭션 관리 모듈 |
| Advice | 실제 부가 기능 코드 | 트랜잭션 시작/커밋/롤백 코드 |
| Pointcut | Advice를 어디에 적용할지 | @Transactional 붙은 메서드 전부 |
| JoinPoint | Advice가 실제 적용된 지점 | createUser() 실행 시점 |
| Weaving | Advice를 핵심 로직에 끼워넣는 과정 | 프록시 객체 생성 |
| 종류 | 실행 시점 | 용도 |
|---|---|---|
| @Before | 메서드 실행 전 | 권한 체크, 파라미터 검증 |
| @After | 메서드 실행 후 (성공/실패 무관) | 리소스 해제, 로그 기록 |
| @AfterReturning | 메서드 정상 종료 후 | 변환값 로깅 |
| @AfterThrowing | 예외 발생 후 | 예외 로깅, 알림 |
| @Around | 메서드 앞뒤 전부 | 트랜잭션, 실행시간 측정 |