programing

Java 레코드를 @Service / @RestController 주석과 함께 사용해도 됩니까?

bestprogram 2023. 6. 26. 21:31

Java 레코드를 @Service / @RestController 주석과 함께 사용해도 됩니까?

보일러 플레이트가 적어서 기록으로 하고 싶은데, 문제가 있을까요?

IntelliJ는 기본 Java 클래스 @Service를 다음과 같이 전환할 것을 제안합니다.

@Service
public class LocationService {
    private final PlaceRepository placeRepository;

    @Autowired
    public LocationService(PlaceRepository placeRepository) {
        this.placeRepository = placeRepository;
    }

    public List<PlaceDto> findPlacesByRegionId(Long regionId){
        return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
    }
} 

다음과 같은 Java 레코드 @Service:

@Service
public record LocationService(PlaceRepository placeRepository) {
    public List<PlaceDto> findPlacesByRegionId(Long regionId) {
        return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
    }
}

당신은 그렇게 할 수 있지만, 레코드는 더 나은 것을 가지고 있습니다.get접두사).필요하지 않은 서비스 계층.당신의 서비스 파사드는 또한 일반적으로 공개적인 방법들을 노출시킵니다.@Transactional아무도 사용하지 않을 방법과 혼합해서는 안 됩니다.

또한, 기록은 다음을 정의합니다.equals()&hashCode()서비스 클래스에도 필요하지 않습니다.

결국 레코드와 서비스 간의 유일한 공통 주제는 모든 필드가 일반적으로final그리고 그들 모두는 보통 건설업자를 통해 전달됩니다.이것은 흔한 일이 아닙니다.그래서 이것에 기록을 사용하는 것은 좋지 않은 생각처럼 들립니다.

Oracle 담당자의 을 인용하겠습니다.

JEP 395는 다음과 같이 말합니다.

[레코드]는 불변 데이터에 대한 투명한 전달자 역할을 하는 클래스입니다.

그래서 기록을 만들면 컴파일러, 동료들, 그리고 전 세계에 이런 유형이 데이터에 관한 것이라는 것을 알 수 있습니다.더 정확히 말하면, (천천히) 불변하고 투명하게 액세스할 수 있는 데이터입니다.그것이 핵심 의미론입니다. 다른 모든 것들은 여기서부터 따라옵니다.

이 의미가 만들려는 유형에 적용되지 않으면 레코드를 만들지 않아야 합니다.만약 여러분이 그것을 한다면(보일러 플레이트가 없다는 약속이나 레코드가 @Data/@Value 또는 데이터 클래스와 동일하다고 생각하기 때문에), 여러분은 여러분의 디자인을 혼란스럽게 하고 있고 그것이 여러분을 물어뜯을 가능성이 높습니다.그러니까 하지 마.

업데이.

"IntelliJ는 기본 Java 클래스 @Service를 이와 같이 만들 것을 제안합니다."라는 귀하의 발언의 근본 원인을 파악하기 위해 몇 분을 보냈습니다.그리고 다음 토론을 찾았습니다: https://youtrack.jetbrains.com/issue/IDEA-252036 . https://youtrack.jetbrains.com/issue/IDEA-252036

결과:

  • 봄 콩에 레코드를 사용하는 것은 확실히 나쁜 생각입니다. 그러한 콩은 자동 프록시에 적합하지 않으며, 더욱이 레코드는 그러한 시나리오를 위해 설계되지 않습니다.
  • 당황스럽지만 JetBrain은 CE 사용자를 오도합니다.

언급URL : https://stackoverflow.com/questions/70403180/is-it-ok-to-use-java-records-with-service-restcontroller-annotations