TIL 51 [ JPA 심화 플러스 과제( Lv 1 ), AWS (입문, IAM) ]

2025. 5. 7. 20:52·[내일배움캠프-Sparta]/Spring 6기
반응형

14:00 ~ 15:00 Spring Security 세션

16:00 ~ 17:00 Spring Security + OAuth2 ( 스탠다드 )

1️⃣ JPA 플러스 과제 (필수 Lv1)

요구사항(문제) - 원인 - 해결 순으로 작성 (개선 문제만 해당)

✅ 1. 코드 개선 퀴즈 - @Transactional의 이해

  • 할 일 저장 기능을 구현한 API(/todos)를 호출할 때, 아래와 같은 에러가 발생
더보기
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class TodoService {

    private final TodoRepository todoRepository;
    private final WeatherClient weatherClient;

    @Transactional  // <---- 추가 
    public TodoSaveResponse saveTodo(AuthUser authUser, TodoSaveRequest todoSaveRequest) {
        User user = User.fromAuthUser(authUser);

        String weather = weatherClient.getTodayWeather();

        Todo newTodo = new Todo(
                todoSaveRequest.getTitle(),
                todoSaveRequest.getContents(),
                weather,
                user
        );
        Todo savedTodo = todoRepository.save(newTodo);

        return new TodoSaveResponse(
                savedTodo.getId(),
                savedTodo.getTitle(),
                savedTodo.getContents(),
                weather,
                new UserResponse(user.getId(), user.getEmail(), user.getNickname())
        );
    }

원인: Service에서 하나의 트랜잭션 단위로 선언되어 있어서, 일정 생성 메소드를 다른 하나의 트랜잭션으로 분리해줄 필요가 있음.

 

해결: 일정을 생성하는 트랜잭션에 @Transcational 어노테이션을 추가하여 문제를 해결.

✅ 2. 코드 추가 퀴즈 - JWT의 이해

🚨 기획자의 긴급 요청이 왔어요! 아래의 요구사항에 맞춰 기획 요건에 대응할 수 있는 코드를 작성해주세요.

  • User의 정보에 nickname이 필요해졌어요.
    • User 테이블에 nickname 컬럼을 추가해주세요.
    • nickname은 중복 가능합니다.
  • 프론트엔드 개발자가 JWT에서 유저의 닉네임을 꺼내 화면에 보여주길 원하고 있어요.

(1) 요구사항에 맞춰, User 엔티티에 nickname 필드를 추가, 이때 중복은 가능하기 때문에 따로 unique한 설정은 필요없음.

 

(2) JWT에서 유저의 닉네임을 꺼내 화면에 보여주길 원하고 있다는 요구사항으로 JWT 관련 클래스에 nickname을 모두 적용함.

JWT 관련 클래스 모두 nickname 필드 적용

이외에도 일정 생성, 댓글등 닉네임 필드를 출력하도록 각각 ResponeDto 적용

✅ 3. 코드 개선 퀴즈 - JPA의 이해

 🚨 기획자의 긴급 요청이 왔어요! 아래의 요구사항에 맞춰 기획 요건에 대응할 수 있는 코드를 작성해주세요.

  • 할 일 검색 시 weather 조건으로도 검색할 수 있어야해요.
    • weather 조건은 있을 수도 있고, 없을 수도 있어요!
  • 할 일 검색 시 수정일 기준으로 기간 검색이 가능해야해요.
    • 기간의 시작과 끝 조건은 있을 수도 있고, 없을 수도 있어요!
  • JPQL을 사용하고, 쿼리 메소드명은 자유롭게 지정하되 너무 길지 않게 해주세요.

💡 필요할 시, 서비스 단에서 if문을 사용해 여러 개의 쿼리(JPQL)를 사용하셔도 좋습니다.

컨트롤러에 weather, startDate, endDate 매개변수를 선언하고 서비스로 요청값을 보냄. ( weather 조건은 있을 수도 있고, 없을수도 있다 ➡ 필수  ❌ )

서비스에서 weather가 있을때와 없을때의   todoRepository내 적절한 쿼리문을 쓰는 메소드를 추가한다. 날짜는 JSON에서 String으로 형태로 받아야하므로 toString메소드를 통해서 형변환 하도록한다.

todoRepository내 에서 weather, startDate, endDate 정보를 포함한 쿼리 메소드를 선언.

✅ 4. 테스트 코드 퀴즈 - 컨트롤러 테스트의 이해

  • 테스트 패키지 org.example.expert.domain.todo.controller의 todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() 테스트가 실패하고 있어요.
  • 테스트가 정상적으로 수행되어 통과할 수 있도록 테스트 코드를 수정해주세요.

 

원인: 예상을 하는 값으론 Http 상태코드가 200을 예상했지만, 실제로는 400이라는 Bad Rquest가 발생하고 있어서 오류가 발생.

 

해결: 200 ok 관련된 코드들을 모두 400 코드로 변경하여 해결

✅ 5. 코드 개선 퀴즈 - AOP의 이해

 😱 AOP가 잘못 동작하고 있어요!

  • UserAdminController 클래스의 changeUserRole() 메소드가 실행 전 동작해야해요.
  • AdminAccessLoggingAspect 클래스에 있는 AOP가 개발 의도에 맞도록 코드를 수정해주세요.

원인

  1. @After 어노테이션을 사용해서, () 안에 있는 메소드를 실행이 되고 난 이후에 동작 하고 있다.
  2. 괄호 안에 메소드는 현재 요구사항과 맞지않는 메소드를 지정하고 있음.

해결

  1. @After는 ~이후 라는 뜻으로 반대 개념인 @Before ~전에 라는 어노테이션을 사용
  2. 그러고 요구사항에 맞는 메소드를 지정해서 @Before 어노테이션에 적용시켜준다.

2️⃣ AWS ?

AWS( Amazon Web Services ) 아마존닷컴이 제공하는 클라우드 컴퓨팅 플랫폼이며, 전 세계에 분산되어 있는 데이터 센터에서 고객에게 IT 인프라를 제공하며, 이를 사용해 고객은 필요한 인프라를 빠르고 쉽게 설정하고 관리할 수 있습니다.

✅ AWS의 주요 서비스

  • 컴퓨팅: EC2 (Elastic Compute Cloud), Elastic Beanstalk 등
  • 데이터베이스: RDS (Relational Database Service) 등
  • 스토리지: S3 (Simple Storage Service), EBS (Elastic Block Store)등
  • 네트워킹: VPC (Virtual Private Cloud), CloudFront, Route 53 등
  • 보안: IAM (Identity and Access Management) 등

✅ AWS 리전(region)

  • AWS 리전(Region)은 세계 각지에 있는 AWS 데이터 센터의 물리적인 위치를 의미합니다. 각 리전은 여러 개의 가용 영역(Availability Zone, AZ)으로 구성되어 있습니다. 가용 영역은 독립적인 데이터 센터로 구성되어 있으며, 네트워크 연결로 연결되어 있습니다.
  • 여러개의 AZ를 씀으로써 데이터센터가 재해상황에 빠졌을때도 서비스를 유지할 수 있는 고가용성을 확보할 수 있습니다.

✅ 고가용성

  • 고가용성(High Availability)은 시스템이 예기치 않은 장애 또는 중단에도 불구하고 지속적으로 작동하는 능력을 말합니다.

3️⃣ IAM ( Identity and Access Management )

✅ IAM 

AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스

IAM을 사용시 AWS에서 사용자, 그룹 및 역할을 생성하고 관리해 리소스에 대한 액세스를 안전하게 제어할 수 있음

  1. 인증: IAM을 사용해 사용자가 AWS 리소스에 액세스할 때 사용자 이름과 암호를 요청해 인증할 수 있음.
  2. 권한 부여: IAM을 사용해 사용자, 그룹 또는 역할에 대한 권한을 지정할 수 있음. 권한은 AWS 리소스에서 수행할 수 있는 작업을 나타내며 IAM 정책을 사용해 지정할 수 있음.
  3. 권한 검증: IAM을 사용해 사용자가 AWS 리소스에 대한 액세스를 요청할 때 요청이 인증된 사용자에게 혀용되는지 여부를 결정할 수 있음. IAM은 권한 검증을 수행하기 위해 사용자가 AWS 리소스에 대한 액세스를 요청할 때 IAM 정책을 적용함.
  • Global 서비스
  • 회원가입시 만들어진 Root Account는 사용/공유되지 않아야 한다.
  • User와 Group을 만들어서 사용해야 한다.
    • Group는 개발자, 운영과 같이 유저 종류를 지정한다
    • User는 실제 로그인 하는사람
    • User는 Group에 속하지 않을수도, 여러 Group에 속할 수 있다.
  • 이렇게 만들어진 Group과 User들은 Policy를 통해 권한을 조정
    • 최소한의 권한 원칙(least privilege principle)

✅ User, Groups, Policy

  1. 사용자(User): IAM에서 사용자는 AWS 계정에 액세스하는 개별 인물 또는 서비스임. AWS IAM에서는 계정에 액세스하는 각 사용자에 대해 별도의 보안 자격 증명을 생성할 수 있음. 이를 통해 사용자가 AWS 리소스에 대한 액세스 권한을 가지며, 이러한 액세스 권한은 IAM 정책을 사용해 관리됨
  2. 그룹(Group): IAM에서 그룹은 하나 이상의 사용자를 그룹화하여 이들에게 공통된 권한을 부여하는데 사용, 그룹은 유사한 권한을 가진 여러 사용자를 효과적으로 관리하도록 도와줌  
    • 예) 특정 Amazon S3 버킷에 대한 읽기 및 쓰기 액세스를 가진 모든 사용자를 그룹화
    • 그룹에 대한 권한으 IAM 정책을 사용해 관리
  3. 정책(Policy): IAM 정책은 AWS 리소스에 대한 액세스 권한을 지정하는데 사용되며, 사용자 또는 그룹과 연결됨. IAM 정책은 JSON 형식으로 작성되며, 허용 또는 거부할 수 있는 작업 및 AWS 리소스에 대한 액세스 수준을 지정함. IAM 정책은 일반적으로 최소 권한 원칙을 따름.  즉, 필요한 권한만 부여하고, 불필요한 권한을 제거하여 보안을 강화

위와 같이 IAM에서는 사용자, 그룹, 정책을 사용하여 AWS 리소스에 대한 액세스 권한을 지정하고 관리하며, 이를 통해 AWS 리소스에 대한 보안을 강화하고, 사용자에게 필요한 권한만 부여하여 보안을 유지할

 

Policy 생성 (JSON)

IAM을 통한 유저를 생성

Policy -  AdministratorAccess는 AWS에 모든 권한을 부여함.

✅ IAM을 통한 로그인 방법

 

IAM 서비스에서 AWS 계정 파트에서 계정 별칭을 편집을 마음대로 할수있으며,  위 사진의 URL을 타고 들어가면 해당 로그인창이 나타난다.

 

이때 여기서 로그인을 할시 IAM 유저를 생성한 username과 password를 입력하여 로그인 할 수 있다. 

( Root AWS 계정과는 별개임, 서브계정 )

IAM으로 로그인한 화면

✅ IAM 정책

{
  "Version": "policy-version",
  "Statement": [
    {
      "Effect": "allow-or-deny",
      "Action": ["action-name"],
      "Resource": ["resource-arn"],
      "Condition": {
        "condition-operator": {
          "condition-key": "condition-value"
        }
      }
    }
  ]
}
  • Version: 정책의 버전을 나타냅니다. 현재는 "2012-10-17" 에서 고정되었습니다.
  • Statement: 정책의 규칙을 나타냅니다. 배열 형태로 여러 개의 규칙을 작성할 수 있습니다.
  • Effect: 규칙의 적용 여부를 나타냅니다. "allow" 또는 "deny" 중 하나를 선택합니다.
  • Action: 규칙이 적용되는 작업의 종류를 나타냅니다. 예를 들어 "s3:ListBucket"과 같은 형식으로 작성합니다.
  • Resource: 규칙이 적용되는 리소스의 ARN (Amazon Resource Name)을 나타냅니다. 예를 들어 "arn:aws:s3:::my-bucket/*"과 같은 형식으로 작성합니다.
  • Condition: 규칙이 적용되는 조건을 나타냅니다. 필수는 아니며, 필요한 경우 추가할 수 있습니다. 다양한 조건 연산자를 사용할 수 있습니다. 예를 들어 "IpAddress" 조건 연산자를 사용하면 특정 IP 주소에서만 작업을 수행할 수 있도록 제한할 수 있습니다.

✅ MFA

MFA는 Multi-Factor Authentication의 약어로, 다중 인증 요소 인증 방식을 의미

이 방식은 일반적인 사용자 ID와 비밀번호 입력 외 추가적인 인증 요소를 요구하여 보안을 강화하는 방법임.

일반적인 로그인 절차에서는 사용자가 ID와 비밀번호를 입력하여 인증을 완료함.

하지만 MFA를 사용시, 사용자는 일반적인 로그인 정보 외에도 추가적인 인증 요소를 제공해야 함.

이는 일반적으로 사용자의 소유물인 스마트폰 또는 하드웨어 보안 토큰 등을 사용하여 구현됨

 

MFA를 사용하면 사용자의 로그인 정보가 유출되어도 보안을 유지할 수 있음.

  • 악의적인 공격자가 사용자의 ID와 비밀번호를 훔쳐 로그인 시도
  • ➡ MFA를 사용하면 추가적인 인증 요소를 입력하지 않을 시 로그인 🙅‍♂️

이를 통해 AWS와 같은 클라우드 서비스에서는 중요한 데이터와 리소르를 안전하게 보호 할수 있다.

 

  • 루트유저에는 반드시 적용 할 것
  • 추가로 만드는 IAM User에도 반드시 적용

 

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 53 [ JPA 심화 플러스 과제 ( Lv2 ) ]  (0) 2025.05.09
TIL 52 [⚓ Spring Security + 💡 Tip ( H2, Intelij http ) ]  (0) 2025.05.08
테스트 코드 ( 베이직 )  (0) 2025.05.06
⚓Spring Security ( 스탠다드 )  (0) 2025.05.06
📅 연관관계와 N+1 문제 💥  (0) 2025.05.05
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 53 [ JPA 심화 플러스 과제 ( Lv2 ) ]
  • TIL 52 [⚓ Spring Security + 💡 Tip ( H2, Intelij http ) ]
  • 테스트 코드 ( 베이직 )
  • ⚓Spring Security ( 스탠다드 )
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CPU
    OS
    KPT
    개발자
    컴퓨터구조
    SQLD
    spring
    배포
    docker
    web
    It
    network
    Python
    cs
    웹
    네트워크
    db
    코딩테스트
    AWS
    Java
    세션
    Testcode
    SQL
    백엔드
    운영체제
    내일배움캠프
    Til
    메모리
    알고리즘
    트랜잭션
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 51 [ JPA 심화 플러스 과제( Lv 1 ), AWS (입문, IAM) ]
상단으로

티스토리툴바