Добрый день.
Если вы установите Sonarlint, то наверняка он пожалуется на то, что ваш метод можно упростить.
Также обратите внимание на то, что 1 метод должен отвечать за 1 функционал.
Если у вас в названии метода есть например, ключевое слово And, то как минимум ваш метод можно разделить на 2 метода. На сайте refactoring.gugu есть неплохой видеокурс и книга по clean code. Но наверное, все же стоит обратиться к более академическим источникам.
Вот, эту строку можно вынести в отдельный метод:
Optional<User> user = userRepositoyry.findById(id)
Например,
public User findUserById(Long id) {
userRepository.findById(id)
.orElseThrow(ResourceNotFoundException::new);
}
// Запись файлов для необходимой логики, логирование, обработка входных и выходных данных и т.д.
Логирование
Наверное, не самая лучшая идея с точки зрения простоты реализации, но можно использовать возможности AOP для логирования. Например, если вы используете Spring, то вы можете использовать Spring AOP (before, after, around, afterReturn)
Обработку входных и выходных данных можно вынести в отдельные приватные методы.
Не видя полную задачу сложно что-либо еще объективно сказать. Что касается паттерна Chain of Responsibility, то на мой взгляд он вам тут не поможет.