NAT Gateway를 활용한 Private EC2의 외부 통신 흐름 정리
·
DEVELOP/AWS
VPC를 공부하면서 백엔드 서버를 public subnet에 둘지, private subnet에 둘지 혼란스러웠다. 보안을 고려하면 private이 맞는 것 같지만, 외부 API를 호출해야 하는 경우엔 통신이 어떻게 흘러가는지 궁금해졌다. 일단 private subnet은 NAT gateway를 통해 외부 인터넷 통신을 위한 아웃바운드가 가능하다. 또한 NAT gateway는 stateful한 성질을 가지고 있어서 요청에 대한 연결을 저장해두기 때문에, 외부API를 요청했을 때 그에 대한 응답도 NAT gateway로 받을 수 있다. 다만 걸리는 것은 NACL(Network Access Contol List)와 보안그룹에 의해 private subnet까지 이 응답이 도달하지 못할 거라고 생각했다. 그래..
Reflection
·
DEVELOP/SPRING
Spring을 학습할수록 ‘리플렉션’이라는 용어를 자주 접하게 된다.DI, JPA, 요청 바인딩 등 스프링의 주요 기능들이 모두 이 개념과 밀접하게 관련되어 있기 때문이다.하지만 리플렉션이 정확히 어떤 개념이고, 어떻게 동작하며, 왜 스프링에서 핵심적인 역할을 하는지는 처음에는 쉽게 와닿지 않는다.이 글에서는 리플렉션의 개념을 정의하고, 자바에서 제공하는 Reflection API의 구조를 살펴본 뒤,스프링과 JPA에서 이를 어떻게 활용하고 있는지를 구체적으로 예시를 통해 설명하고자 한다. 리플렉션(Reflection)이란?넓은 관점에서 리플렉션의 정의는 프로그래밍에서 런타임에 프로그램의 구조와 동작을 조사하고 수정할 수 있는 능력이다.즉, 프로그램이 실행되는 동안 자신의 코드에 접근하여 클래스, 메서드..
protected 기본 생성자
·
DEVELOP/CONCEPT
왜 기본 생성자에 protected를 쓰는가?JPA 엔티티에서 기본 생성자에 protected 접근 제어자를 쓰는 건 아주 흔하고 권장되는 패턴이다. 그렇담 왜 public이 아닌 protected를 써야할까? 1. JPA는 기본 생성자를 필요로 한다.JPA는 내부적으로 리플렉션을 사용해 객체를 생성하기 때문에, 기본 생성자가 없으면 엔티티를 생성할 수 없다. 그래서 무조건 기본 생성자가 필요하다. 2. 하지만 public은 너무 개방적이다.기본생성자를 public으로 열어두면, 외부 코드에서 실수로 new Entity() 객체를 생성할 수 있다. 즉 불완전한 상태의 객체가 생길 수 있는 것이다. 이는 특히 도메인 무결성이 깨질 가능성으로 이어진다. public vs private vs protected..
[SPRING/JPA] Fetch 전략
·
DEVELOP/SPRING
Fetch 전략에 대해 알아보기 전에 먼저 Entity를 살펴보자.스프링부트에서 Entity를 구성할 때 아래와 같이 연관관계가 있는 객체들은 List와 같이 @OneToMany, @ManyToOne 같은 어노테이션으로 선언을 한다.package org.sopt.domain;import jakarta.persistence.*;import java.util.ArrayList;import java.util.List;@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @OneT..