목록전체 글 (75)
Arthur's Blog
📌 정의 관심사의 분리(Separation of Concerns, SOC)는 관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모이게 하고, 관심이 다른 것은 가능한 따로 떨어져서 서로 영향을 주지 않도록 분리하는 것.
🐛 문제 상황 error: builder() in 자식객체 cannot hide builder() in 부모객체 라는 에러가 나오게 된다. 간단하게 직역하면 “자식객체의 builder()는 부모객체의 builder()에 숨을 수 없다.”라는 말인데 이것을 해결하려면 상속에 대한 기본적인 개념이 있어야한다. 🏴☠️ 원인 Builder 어노테이션을 사용하면 컴파일 시 해당 클래스에 Builder 클래스와 메소드가 생기게 된다. 자식 객체에서 동일하게 Builder 어노테이션을 사용하게 되면 builder() 메소드가 중복되게 되면서 error가 발생하게 된다. ♻ 해결법 자식객체 또는 부모객체에서 @Builder어노테이션의 property중 하나인 builderMethodName를 설정해주면 된다. 물론 ..

🎊 시작하기 전에.. 이 글을 읽기 전에 VPC와 로드밸런서에 대한 기본적인 지식이 필요합니다. AWS 구조는 한 AZ(가용영역) 내부에 EC2와 RDS를 구축하는 것을 목표로 합니다. EC2는 public 서브넷, RDS는 private 서브넷으로 설정하는 것을 목표로 합니다. 1️⃣ 가장 먼저 VPC 생성 VPC생성 및 설정을 해주어야 합니다. AWS에서 VPC로 들어간 후 VPC 생성을 눌러줍니다. IPv4 CIDR 블록 간단하게 CIDR은 기존의 IP 주소 할당 방식이었던 네트워크 클래스 방법을 대체한 방식입니다. CIDR은 IP Address의 영역을 나눌 때 기존방식보다 유연하게 자신이 원하는 Network Address와 Host Address를 나눌 수 있습니다. 아래의 Private IP..
📌 SRE란? 사이트 신뢰성 엔지니어링은 IT 운영에 대한 소프트웨어 엔지니어링 접근 방식입니다. SRE 팀은 소프트웨어를 툴로 활용하여 시스템을 관리하고, 문제를 해결하고, 운영 태스크를 자동화합니다. SRE는 확장 가능하고 신뢰성이 높은 소프트웨어 시스템을 생성할 때 유용한 방법입니다. 코드를 통해 대규모로 시스템을 관리할 수 있으므로 수천 대에서 수십만 대에 이르는 머신을 관리하는 시스템 관리자에게 더 큰 확장성과 지속가능성을 제공합니다. Google 엔지니어링 팀의 Gen Treynor Sloss가 창안한 개념입니다. 👍 SRE를 사용함으로써 있는 장점 새 기능을 적시에 출시하고, 사용자가 이 기능을 안정적으로 사용하도록 할 수 있습니다. 🥼SRE 엔지니어의 역할 부가적인 운영 경험이 있는 소프트..

📑 버킷 생성 AWS S3탭으로 접근해서 버킷 만들기를 눌러서 버킷 생성 설정으로 들어간다. ⚡ 액세스 권한 변경 기본 설정으로는 모든 퍼블릭 액세스 차단으로 되어있는데, 퍼블릭 엑세스를 해주려면 모든 퍼블릭 엑세스 차단을 해제해야한다. 🔓 버킷 정책 변경 버킷 생성 후 버킷에서 권한탭을 들어가서 정책에서 편집을 누른 후 { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::music-ward/*" } ] } 를 기입해주고 변경 사항 저장을 눌러준다.
class User { @Id private String username; @ManyToOne private School school; } @Query(select u from User u where user.school = :schoolName) List findBySchool(@Param('schoolName')String schoolName); 위 Repository interface는 얼핏 보면 그럴싸 해보이지만 실제로 구동을 시켜보면 500에러와 함께 application이 소리를 지른다. 그 이유는 school은 객체로 맵핑이 되어있기 때문인데 실제 작동을 시키려면 @Query(select u from User u where user.school.schoolName = :schoolName)..

AWS는 전세계에 약 20개의 리전, 즉 거점을 제공함. 리전하나에는 최소 두 개이상의 AZ(가용영역)이라고 하는 논리적인 데이터 센터들의 클러스터가 존재한다. 전세계의 유저들에게 빠르게 컨텐츠를 제공하려면 CDN서비스가 필요하며 AWS는 CloudFront라고하는 CDN서비스를 제공하고 있다. CloudFront는 전세계에 166개 이상의 엣지 로케이션에서 서비스되고 있다. 실 사용자 1명 페일오버, 이중화 필요없음. 아주 단순한 구조. VM에 고정 IP(Elastic Ip)를 부여하고, 고정 IP를 통해서 접근할 수 있지만, IP는 외우기 힘드므로 AWS Route 53을 이용해서 도메인 주소로 접근할 수 있게한다. 더 큰 시스템 필요 시 가장 단순한 접근으로는 수직적 확장을 하는것인데 언젠가는 결국..
@Getter @Setter public class QueryRequest { private userName; private userEmail; } @RestController @RequiredConstructor public class QueryController { private final UserService; @GetMapping("/") public QueryResponse QueryTest(QueryRequest query) { return userService.UseQueryMethod(query); } } 주의 사항으로는 QueryRequest에 존재하는 필드의 명과 QueryString으로 오는 필드의 명이 동일해야 한다는 점이다. 따라서 @JsonAlias("user_name")과 같이..