Leehyoungwoo / vacation-study

vacation study
0 stars 0 forks source link

2023-12-15 TIL #18

Open Leehyoungwoo opened 6 months ago

Leehyoungwoo commented 6 months ago

map.forEach((key, value) -> sum.addAndGet(value));는 map의 모든 엔트리(키-값 쌍)을 순회하며 주어진 람다 표현식을 실행하는 코드입니다. sum.addAndGet(value)는 각 엔트리의 키와 값을 인자로 받아 sum에 값을 더하는 작업을 수행합니다. addAndGet 메소드는 주어진 값을 현재 값에 더하고 그 결과를 반환하는 AtomicLong의 메소드입니다.

마지막으로 System.out.println(sum.get());는 sum의 현재 값을 가져와 콘솔에 출력하는 코드입니다. get 메소드는 AtomicLong의 현재 값을 반환하는 메소드입니다.

Java의 Map 인터페이스에서는 이 엔트리를 Map.Entry<K,V> 인터페이스로 표현합니다. 여기서 K는 키의 타입, V는 값의 타입을 나타냅니다.

Map.Entry<K,V> 인터페이스는 다음과 같은 메소드를 제공합니다:

K getKey(): 엔트리의 키를 반환합니다. V getValue(): 엔트리의 값을 반환합니다. V setValue(V value): 엔트리의 값을 주어진 값으로 변경하고, 이전 값을 반환합니다. 맵의 모든 엔트리를 순회하려면 Map 인터페이스의 Set<Map.Entry<K,V>> entrySet() 메소드를 사용할 수 있습니다. 이 메소드는 맵의 모든 엔트리를 포함하는 Set 객체를 반환합니다. 이 Set 객체를 통해 for 루프나 Iterator를 사용하여 맵의 모든 엔트리를 순회할 수 있습니다.

AtomicLong은 특히 멀티스레딩 환경에서 유용합니다. 여러 스레드가 동시에 같은 변수를 수정하려고 할 때, 데이터의 일관성을 유지하기 위해 원자적 연산이 필요합니다. 만약 원자적 연산 없이 멀티스레드 환경에서 공유 변수의 값을 변경하려고 하면, 데이터 경쟁 조건(race condition)이 발생할 수 있습니다.

하지만, 해당 코드에서는 멀티스레딩 환경이 아니므로 AtomicLong 대신 long을 사용해도 무방합니다. AtomicLong을 사용한 이유는 아마도 map.forEach에서 람다 표현식 내부에서 외부의 로컬 변수를 변경하기 위해 사용되었을 것입니다. 람다 표현식 내부에서는 외부의 로컬 변수를 변경할 수 없는데, AtomicLong은 객체이므로 이를 우회할 수 있습니다.

간단히 말해, AtomicLong은 여러 스레드에서 안전하게 long 값을 읽고 쓰기 위한 클래스이며, 또한 람다 표현식에서 외부의 long 값을 안전하게 변경하기 위해 사용될 수 있습니다.

Leehyoungwoo commented 6 months ago

@PreAuthorize 어노테이션은 메소드를 실행하기 전에 보안 표현식을 통해 권한을 검사하는 방법을 제공합니다. 표현식의 결과가 true일 경우, 메소드가 실행되고, false일 경우에는 AccessDeniedException이 발생하여 메소드가 실행되지 않습니다.

@authService.authorizeToUpdateBoard(#userDetails.getId(), #boardId)는 authService 빈의 authorizeToUpdateBoard 메소드를 호출하며, 이 메소드는 사용자 ID와 게시판 ID를 매개변수로 받습니다. 이 메소드는 사용자가 해당 게시판을 업데이트할 권한이 있는지를 판단하며, 권한이 있다면 true를, 없다면 false를 반환합니다.

이렇게 @PreAuthorize를 이용하면 메소드 실행 전에 복잡한 보안 요구사항을 표현식으로 간단하게 처리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 됩니다.

Leehyoungwoo commented 6 months ago

이메일 형식의 유효성을 확인할 때 Apache Commons Validator 라이브러리의 EmailValidator를 사용하는 것은 일반적인 방법 중 하나입니다. 이 라이브러리는 잘 알려져 있고, 잘 유지되고 있으며, 이메일 주소의 형식을 검사하는 데 필요한 많은 규칙을 이미 구현하고 있습니다.

EmailValidator의 구현은 다음과 같은 절차를 따릅니다:

먼저, 이메일 주소가 null이거나 빈 문자열인지 확인합니다. 만약 그렇다면, isValid() 메서드는 false를 반환합니다. 그 다음, 이메일 주소가 정의된 형식에 맞는지 확인하기 위해 정규식을 사용합니다. 이 정규식은 이메일 주소의 일반적인 형식을 나타냅니다. 만약 이메일 주소가 정의된 형식에 맞지 않다면, isValid() 메서드는 false를 반환합니다. 마지막으로, 이메일 주소의 도메인 부분이 유효한 도메인인지 확인합니다. 이 확인은 선택적이며, EmailValidator의 인스턴스를 생성할 때 선택할 수 있습니다. 도메인의 유효성을 확인하려면 DNS 조회를 수행해야 하므로, 이 작업은 시간이 걸릴 수 있습니다. 이와 같은 방식으로 EmailValidator는 이메일 주소의 형식을 검사하고, 필요한 경우 도메인의 유효성까지 검사합니다. 이런 기능 덕분에, 이 라이브러리는 이메일 주소의 유효성을 검사하는 데 매우 유용합니다.

Leehyoungwoo commented 6 months ago

객체 지향적으로 코드를 작성하려면, 데이터를 다루는 로직을 가능한 한 해당 데이터를 보유한 객체가 처리하도록 하는 것이 중요합니다. 따라서 'Soft Delete'를 구현하는 delete() 메서드를 엔티티 클래스에 추가하고, 이 메서드를 서비스에서 호출하도록 코드를 수정하는 것이 좋습니다.

Leehyoungwoo commented 6 months ago