Fullstack-Study

OOP 4대 원칙

1. 캡슐화 (Encapsulation)

public class User {
    private String name;  // 외부 직접 접근 불가

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

2. 상속 (Inheritance)

public class Animal {
    public void eat() { System.out.println("먹는다"); }
}
public class Dog extends Animal {
    public void bark() { System.out.println("짖는다"); }
}
// Dog는 eat()도 쓸 수 있음

3. 다형성 (Polymorphism)

class Animal {
    public void sound() {
        System.out.println("...");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {         // 부모 메서드를 재정의
        System.out.println("멍멍");
    }
}

4. 추상화 (Abstraction)

interface Payment {
    void pay(int amount);  // 어떻게 결제하는지는 구현체가 결정
}
class KakaoPay implements Payment {
    public void pay(int amount) { /* 카카오페이 결제 */ }
}
class NaverPay implements Payment {
    public void pay(int amount) { /* 네이버페이 결제 */ }
}

Java 컬렉션

List

종류 특징 사용 이유
ArrayList 배열 기반, 조회 빠름 O(1) 조회가 많을 때
LinkedList 노드 연결, 삽입/삭제 빠름 O(1) 삽입/삭제가 많을 때

Map

종류 특징 사용 이유
HashMap 순서 없음, 조회 O(1) 빠른 검색
LinkedHashMap 입력 순서 유지 순서 중요할 때
TreeMap Key 정렬됨 정렬된 Key 필요할 때

Set

종류 특징 사용 이유
HashSet 순서 없음, 조회 O(1) 중복 제거
TreeSet 정렬됨 정렬된 중복 제거

Spring IoC/DI

IoC (Inversion of Control) - 제어의 역전

// IoC 없을 때 (직접 생성)
UserService service = new UserService(new UserRepository());

// IoC 있을 때 (Spring이 알아서)
@Service
public class UserService { ... }  // Spring이 알아서 생성·관리

DI (Dependency Injection) - 의존성 주입

@Service
public class UserService {
    private final UserRepository userRepository;

    // 생성자 주입 (가장 권장)
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Bean


REST API

HTTP메서드 역할

메서드 역할 예시
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) { }
}

REST API 설계 원칙

주요 HTTP 상태코드

코드 의미
200 OK 성공
201 Created 생성 성공
400 Bad Request 잘못된 요청(클라이언트 오류)
401 Unauthorized 인증 필요
403 Forbidden 권한 없음
404 Not Found 자원 없음
500 Internal Server Error 서버 오류

JPA/ORM

ORM (Object-Relational Mapping)

JPA

// SQL 직접 쓰면
String sql = "SELECT * FROM users WHERE id = ?";

// JPA 쓰면
User user = userRepository.findById(id);

영속성 컨텍스트

N+1 문제


@Transactional

@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);
    // 정상이면 자동 커밋, 예외 나면 자동 롤백
}

동작원리 - AOP 프록시

주의할 점

// 모든 예외에서 롤백하려면
@Transactional(rollbackFor = Exception.class)

AOP(Aspect-Oriented Programming) - 관점지향 프로그래밍

// 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); // 핵심 로직만
}

AOP 용어

용어 설명 예시
Aspect 부가 기능 모듈 전체 트랜잭션 관리 모듈
Advice 실제 부가 기능 코드 트랜잭션 시작/커밋/롤백 코드
Pointcut Advice를 어디에 적용할지 @Transactional 붙은 메서드 전부
JoinPoint Advice가 실제 적용된 지점 createUser() 실행 시점
Weaving Advice를 핵심 로직에 끼워넣는 과정 프록시 객체 생성

Advice 실행 시점

종류 실행 시점 용도
@Before 메서드 실행 전 권한 체크, 파라미터 검증
@After 메서드 실행 후 (성공/실패 무관) 리소스 해제, 로그 기록
@AfterReturning 메서드 정상 종료 후 변환값 로깅
@AfterThrowing 예외 발생 후 예외 로깅, 알림
@Around 메서드 앞뒤 전부 트랜잭션, 실행시간 측정