본문 바로가기

개발 일지/TIL

[ #32 ] TIL

✏️ 0530      


Spring 숙련 과제

수준별 학습: 스탠다드 이론반


Spring 숙련 과제 + 단축키

중에 찾아본 내용들 정리

 

기억해두면 좋은 단축키

 

 

.var : 자동으로 해당 타입에 맞춰서 변수로 만들어준다

 

 

iter : 향상된 for 문을 자동으로 만들어준다

 

 

 

Ctrl + Shift + O : 불필요한 import 를 한번에 없애준다

 

 

 

Ctrl + Atl + L : 코드 라인을 정리해준다 

 

 

 

ctrl + E : 페이지 이동

 

 

필드에 대한 유효성 검사 (Validation)

 

username과 password 필드에 대한 유효성 검사를 위해

JPA와 함께 사용할 수 있는 javax.validation 어노테이션을 활용하여 예외 처리가 가능하다

@Column(nullable = false, unique = true)  // 중복 X
@NotBlank(message = "사용자 이름 입력은 필수입니다.")
@Size(min = 4, max = 10, message = "최소 4자 이상, 10자 이하로 입력하세요")
@Pattern(regexp = "^[a-z0-9]+$", message = " 알파벳 소문자(a~z), 숫자(0~9)으로 구성되어야 합니다")
private  String username;  // 사용자이름(유저 ID)

@Column(nullable = false)
@NotBlank(message = "비밀번호 입력은 필수입니다.")
@Size(min = 8, max = 15, message = "최소 8자 이상, 15자 이하로 입력하세요")
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "알파벳 대소문자(a~z, A~Z), 숫자(0~9)으로 구성되어야 합니다")
private String password;  // 비밀번호

 

@Pattern 어노테이션을 사용하여 정규식을 통해 유효성 검사를 정의

 

 

 

@Column(unique = true) 의 중복 방지

 

@Column(unique = true) 어노테이션을 사용하면 데이터베이스 레벨에서 해당 컬럼의 중복을 방지한다

데이터베이스 테이블에 UNIQUE 제약 조건을 추가하여 동일한 값이 여러 행에 들어가는 것을 막는 것이다

하지만 데이터베이스 레벨의 중복 방지일 뿐이며, 애플리케이션 레벨에서의 중복 체크 로직과는 별개로 동작한다

 

@Column(nullable = false, unique = true)  // 중복 X
private  String username;  // 사용자이름(유저 ID)

 

unique = true 사용하면,

데이터베이스가 중복된 값을 허용하지 않는다

동일한 값을 가진 데이터가 삽입되면 예외를 발생시킨다 (DataIntegrityViolationException 등)

 

데이터베이스에 저장되는 것은 막지만 예외를 발생시키므로

사용자에게 더 명확한 에러 메시지를 제공하기 위해, 데이터베이스에서 발생하는 예외를 미리 방지하기 위해

애플리케이션 레벨에서도 중복 체크를 하는 것이 일반적이라고 한다

 

 

예외 처리 throws 발생 차이 ( checked , unchecked )

 

// 입력받은 일정 아이디와 댓글 아이디가 제대로 맵핑된 것인지 확인
private void checkScheduleIdAndCommentId(Schedule schedule, Comment comment) {
    if (!schedule.getId().equals(comment.getSchedule().getId())) {
        throw new IllegalArgumentException("해당 댓글은 선택하신 일정에 존재하지 않습니다.");
    }
}

// 댓글을 입력한 유저와 로그인한 유저가 동일한지 확인
private void reqUserCheck(Long loginUserId, Long commentUserId) throws IllegalAccessException {
    if (!loginUserId.equals(commentUserId)) {
        throw new IllegalAccessException("해당 일정을 작성한 사용자가 아닙니다");
    }
}

 

throws 키워드는 메서드가 해당 예외를 직접 처리하지 않고 호출자에게 예외를 전달할 것을 명시하는 데 사용

메서드 내에서 발생한 예외를 상위 메서드나 호출자에게 전달할 필요가 있을 때 throws를 사용

 

IllegalAccessException은 checked 예외

checked 예외는 컴파일러가 해당 예외를 처리하는 코드를 강제하므로,

메서드가 checked 예외를 던질 때에는 해당 예외를 처리하거나 또는 이를 호출한 메서드에게 예외를 던진다는 것을 선언

 

IllegalArgumentException은 unchecked 예외

unchecked 예외는 컴파일러가 해당 예외를 처리하는 코드를 강제하지 않는다

따라서 IllegalArgumentException을 사용하는 메서드에서는 해당 예외를 처리하기 위해 throws를 선언할 필요가 없다

 

 

checked 예외 (Checked Exception)

  • checked 예외는 컴파일러가 강제적으로 예외 처리를 요구하는 예외
  • checked 예외 클래스는 Exception 클래스를 직접 상속하거나 Exception의 하위 클래스를 상속한 클래스
  • 메서드가 checked 예외를 던질 때, 해당 예외를 처리하는 코드를 반드시 작성
    메서드 호출자가 예외를 처리하거나 다시 던지도록 하여 예외에 대한 안정성을 증가
  • ex) IOException, SQLException, IllegalAccessException 등

unchecked 예외 (Unchecked Exception)

  • unchecked 예외는 컴파일러가 예외 처리를 강제하지 않는다
  • unchecked 예외는 RuntimeException 클래스를 직접 상속하거나 RuntimeException의 하위 클래스를 상속한 클래스
  • unchecked 예외는 일반적으로 프로그램의 오류
    ex) 잘못된 메서드 호출, 배열 인덱스 초과, null 포인터 참조 등
  • unchecked 예외는 코드의 가독성을 향상시키고 예외 처리에 대한 부담을 줄일 수 있다
  • ex) NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등

 

 

IllegalAccessException

클래스, 메서드 또는 필드에 접근하려고 할 때 발생

public 으로 선언되지 않은 클래스나 메서드에 접근하려고 할 때 발생

리플렉션(reflection)을 사용하여 private 필드에 접근하려고 할 때 발생

일반적으로 보안 관련 문제로 발생하는 경우가 많다

 

 

IllegalArgumentException

메서드로 전달된 인수의 값이 메서드가 요구하는 범위나 형식을 벗어날 때 발생

메서드가 허용되지 않는 값이나 null 값을 인자로 받을 때 발생

메서드 호출 시 인수가 잘못된 경우에 발생하는 일반적인 예외

 

 

📒 정리

checked 예외와 unchecked 예외에 따라서 throws 발생 차이가 나타난다

IllegalAccessException : 접근 제어와 관련된 문제가 있을 때 발생

IllegalArgumentException : 메서드 인자의 값이 잘못되었을 때 발생

 

 

그러니까...비슷하게(?) 생긴 영어긴 한데 전혀 다른 예외 클래스 라는 거네

코드 수정해야겠다

'개발 일지 > TIL' 카테고리의 다른 글

[ #34 ] TIL  (1) 2024.06.03
[ #33 ] TIL  (0) 2024.05.31
[ #31 ] TIL  (0) 2024.05.29
[ #30 ] TIL  (0) 2024.05.28
[ #29 ] TIL  (0) 2024.05.27