백엔드 개발자의 스프링 공부노트 (3)
본문 바로가기

컴퓨터공부/Springboot

백엔드 개발자의 스프링 공부노트 (3)

by Life & study 2023. 8. 10.
반응형

백엔드 개발자의 스프링 공부노트 (3)

 

[백엔드 개발자의 스프링 공부노트] @GetMapping("/create") 과 @RequestMapping("/create")의 차이는 무엇이냐?

 

  1. @GetMapping("/create"):
    • @GetMapping 어노테이션은 HTTP GET 요청만 처리합니다.
    • @GetMapping은 Spring 4.3 이후에 도입된 주요 HTTP 요청 방식을 처리하기 위한 구체적인 메소드 레벨 어노테이션 중 하나입니다.
    • Spring MVC에서는 다음과 같은 여러 메소드 레벨 HTTP 어노테이션이 있습니다: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping. 이를 사용하면 코드 가독성이 높아지고, 의도한 메소드를 명확하게 표시할 수 있습니다.
  2. @RequestMapping("/create"):
    • @RequestMapping 어노테이션은 HTTP 요청 메소드와 관계없이 해당 URL 경로에 매핑됩니다.
    • 이러한 경우 HTTP 요청 메소드를 명시적으로 지정하지 않았기 때문에, GET, POST, PUT, DELETE 등 모든 요청 방식을 처리하게 됩니다. 이 경우 해당 메소드에서 각 요청 메소드를 구분해서 처리해야 합니다.
    • @RequestMapping 어노테이션을 사용하면 method 속성으로 HTTP 요청 메소드를 명시적으로 지정할 수 있습니다. 예를 들어, 오직 GET 요청만 처리하도록 설정하려면 다음과 같이 사용할 수 있습니다: @RequestMapping(value = "/create", method = RequestMethod.GET)

 

 

 

[백엔드 개발자의 스프링 공부노트]  @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping에 대해 각가의 어노테이션마다 쓰이는 설명을 알려줘라

 

다음은 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, 그리고 @PatchMapping에 대한 각 어노테이션의 설명입니다.

  1. @GetMapping:
    • 이 어노테이션은 HTTP GET 요청을 처리하기 위한 메소드에 사용됩니다.
    • 주로 읽기 작업을 수행하는 데 사용되며, 웹 페이지를 제공하거나 데이터를 조회하는 경우에 활용됩니다.
    • 예시: @GetMapping("/users")
  2. GET 메소드로 들어오는 요청을 처리하는 핸들러 메소드를 지정합니다.
    @RequestMapping(method = RequestMethod.GET)의 축약형입니다.
    예를 들어, @GetMapping("/books")는 "/books" 경로로 들어오는 GET 요청을 처리하는 핸들러 메소드를 지정합니다.
  3.  
  4. @GetMapping: Read(읽기) 작업에 사용됩니다.
    • 데이터를 검색하고 반환하는 데 주로 사용됩니다.
    • 예를 들어, 모든 사용자를 검색하는 경우: @GetMapping("/users") 또는 특정 사용자를 검색하는 경우 @GetMapping("/users/{id}")에 사용되어집니다.

 

 

  1. @PostMapping:
    • 이 어노테이션은 HTTP POST 요청을 처리하기 위한 메소드에 사용됩니다.
    • 주로 데이터 생성 작업을 수행하는 데 사용되며, 서버에 새로운 리소스를 추가하는 경우에 활용됩니다.
    • 예시: @PostMapping("/users")
  2. POST 메소드로 들어오는 요청을 처리하는 핸들러 메소드를 지정합니다.
    @RequestMapping(method = RequestMethod.POST)의 축약형입니다.
    예를 들어, @PostMapping("/books")는 "/books" 경로로 들어오는 POST 요청을 처리하는 핸들러 메소드를 지정합니다.
    • 로운 데이터를 저장하는 데 주로 사용됩니다.
    • 예를 들어, 새 사용자를 저장하려면 @PostMapping("/users")를 사용하여 POST 요청을 처리할 수 있습니다.

 

  1. @PutMapping:
    • 이 어노테이션은 HTTP PUT 요청을 처리하기 위한 메소드에 사용됩니다.
    • 주로 데이터 업데이트 작업을 수행하는 데 사용되며, 서버에 이미 존재하는 리소스의 전체를 변경하는 경우에 활용됩니다.
    • 예시: @PutMapping("/users/{id}")
      • 기존 데이터의 모든 속성을 업데이트하는 데 사용됩니다.
        • 기존 데이터의 모든 속성을 업데이트하는 데 사용됩니다.
        • 예를 들어, 기존 사용자의 모든 정보를 수정하려면 @PutMapping("/users/{id}")를 사용하여 해당 사용자에 대한 요청을 처리할 수 있습니다.
  2. PUT 메소드로 들어오는 요청을 처리하는 핸들러 메소드를 지정합니다.
    @RequestMapping(method = RequestMethod.PUT)의 축약형입니다.
    예를 들어, @PutMapping("/books/{id}")는 "/books/{id}" 경로로 들어오는 PUT 요청을 처리하는 핸들러 메소드를 지정합니다.

 

  1. @DeleteMapping:
    • 이 어노테이션은 HTTP DELETE 요청을 처리하기 위한 메소드에 사용됩니다.
    • 주로 데이터 삭제 작업을 수행하는 데 사용되며, 서버에서 특정 리소스를 제거하는 경우에 활용됩니다.
    • 예시: @DeleteMapping("/users/{id}")
    • 데이터를 삭제하는 데 주로 사용됩니다.
    • 예를 들어, 특정 사용자를 삭제하려면 @DeleteMapping("/users/{id}")를 사용하여 해당 사용자에 대한 요청을 처리할 수 있습니다.

'

  1. @PatchMapping:
    • 이 어노테이션은 HTTP PATCH 요청을 처리하기 위한 메소드에 사용됩니다.
    • 주로 데이터 부분 업데이트 작업을 수행하는 데 사용되며, 서버에 이미 존재하는 리소스의 일부 속성을 변경하는 경우에 활용됩니다.
    • 예시: @PatchMapping("/users/{id}")
      • 기존 데이터의 일부 속성만 업데이트하는 데 사용됩니다.
      • 예를 들어, 기존 사용자의 일부 정보를 수정하려면 @PatchMapping("/users/{id}")를 사용하여 해당 사용자에 대한 요청을 처리할 수 있습니다.
  2. PATCH 메소드로 들어오는 요청을 처리하는 핸들러 메소드를 지정합니다.
    @RequestMapping(method = RequestMethod.PATCH)의 축약형입니다.
    예를 들어, @PatchMapping("/books/{id}")는 "/books/{id}" 경로로 들어오는 PATCH 요청을 처리하는 핸들러 메소드를 지정합니다.
  3.  

각 어노테이션은 RESTful 웹 서비스에서 사용되는 특정 HTTP 요청 메소드를 처리하는 데 주로 사용됩니다. 이를 사용함으로써 코드의 가독성과 명확성을 높이고, 의도한 메소드를 구분할 수 있습니다.

 

 

 

[백엔드 개발자의 스프링 공부노트] CRUD에 쓰이는 어노테이션에 대해 공부

 

@RequestMapping 어노테이션은 여러 HTTP 요청 메소드를 처리할 수 있지만, method 속성을 지정함으로써 특정 HTTP 요청 메소드를 처리할 수 있습니다. 각 요청 메소드에 대한 CRUD 사용용도와 사용법은 다음과 같습니다.

 

  1. @GetMapping (@RequestMapping with method = RequestMethod.GET):
    • CRUD에서 Read(읽기) 작업에 사용합니다.
    • 사용법: @RequestMapping(value = "/path", method = RequestMethod.GET)
    • 예시: 모든 사용자를 읽어오는 경우 @RequestMapping(value = "/users", method = RequestMethod.GET) 또는 특정 사용자를 읽어오는 경우 @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)를 사용합니다.
  2. @PostMapping (@RequestMapping with method = RequestMethod.POST):
    • CRUD에서 Create(생성) 작업에 사용합니다.
    • 사용법: @RequestMapping(value = "/path", method = RequestMethod.POST)
    • 예시: 새 사용자를 생성하는 경우 @RequestMapping(value = "/users", method = RequestMethod.POST)를 사용하여 POST 요청을 처리합니다.
  3. @PutMapping (@RequestMapping with method = RequestMethod.PUT):
    • CRUD에서 Update(업데이트) 작업에 사용합니다. (전체 업데이트)
    • 사용법: @RequestMapping(value = "/path", method = RequestMethod.PUT)
    • 예시: 기존 사용자의 모든 정보를 업데이트하는 경우 @RequestMapping(value = "/users/{id}", method = RequestMethod.PUT)를 사용하여 PUT 요청을 처리합니다.
  4. @DeleteMapping (@RequestMapping with method = RequestMethod.DELETE):
    • CRUD에서 Delete(삭제) 작업에 사용합니다.
    • 사용법: @RequestMapping(value = "/path", method = RequestMethod.DELETE)
    • 예시: 특정 사용자를 삭제하는 경우 @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)를 사용하여 DELETE 요청을 처리합니다.
  5. @PatchMapping (@RequestMapping with method = RequestMethod.PATCH):
    • CRUD에서 Update(업데이트) 작업에 사용합니다. (부분 업데이트)
    • 사용법: @RequestMapping(value = "/path", method = RequestMethod.PATCH)
    • 예시: 기존 사용자의 일부 정보를 수정하는 경우 @RequestMapping(value = "/users/{id}", method = RequestMethod.PATCH)를 사용하여 PATCH 요청을 처리합니다.

@RequestMapping 어노테이션을 사용할 때는 method 속성으로 명시적으로 HTTP 요청 메소드를 지정해야 합니다. 그런데 최근에는 가독성과 명확성을 위해 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 등의 메소드 레벨 어노테이션이 주로 사용됩니다. 이를 사용하면 코딩 원칙 중 하나인 DRY 원칙(Don't Repeat Yourself)을 따르기에 더 적합합니다.

 

 

[백엔드 개발자의 스프링 공부노트] CRUD에서 자주쓰이는 어노테이션

 

  • @Controller: 클래스 레벨에 사용되며, 해당 클래스가 컨트롤러임을 나타내는 어노테이션입니다.
  • @Service: 클래스 레벨에 사용되며, 해당 클래스가 서비스 레이어를 구성하는 비즈니스 로직을 처리하는 어노테이션입니다.
  • @Repository: 클래스 레벨에 사용되며, 해당 클래스가 데이터 레이어를 구성하는 CRUD 작업을 처리하는 어노테이션입니다.

 

[백엔드 개발자의 스프링 공부노트]

 

@Service와 @Repository 어노테이션은 Java Spring 프레임워크에서 사용되는 어노테이션입니다. Spring 프레임워크는 계층화된 아키텍쳐를 사용하여 웹 애플리케이션을 구축하며, 이러한 어노테이션들은 각 계층의 역할을 명확하게 구분하고 코드의 가독성과 유지 관리를 돕습니다.

  1. @Service 어노테이션 @Service 어노테이션은 클래스 레벨에서 사용되며, 해당 클래스가 서비스 계층(service layer)를 구성하는 비즈니스 로직을 처리할 것임을 나타냅니다. 서비스 계층은 주로 컨트롤러에서 호출되어 데이터 처리와 관련된 비즈니스 로직을 수행하는 역할을 합니다.

서비스 계층의 역할에는 다음과 같은 것들이 있습니다:

  • 데이터 접근 계층과의 인터페이스를 제공하여 해당 계층을 감싸는 역할
  • 워크플로와 비즈니스 로직 처리
  • 트랜잭션리, 캐싱, 보안 등에 대한 처리

다음은 @Service 어노테이션이 사용된 예입니다.

java
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public User findById(Long id) {
        return userRepository.findById(id);
    }
}
  1. @Repository 어노테이션 @Repository 어노테이션은 클래스 레벨에서 사용되며, 해당 클래스가 데이터 계층(data access layer)를 구성하는 CRUD 작업을 처리할 것임을 나타냅니다. 데이터층은 주로 데이터베이스와 통신하여 데이터를 저장, 검색, 수정, 삭제하는 역할을 합니다.

데이터 계층의 역할에는 다음과 같은 것들이 있습니다:

  • 데이터베이스 연결 및 쿼리 수행
  • 데이터 매핑 및 모델링
  • 데이터 검색 결과를 도메 객체로 반환

다음은 @Repository가 사용된 예입니다.

java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findById(Long id);
}

간단히 말해, @Service는 서비스 계층의 구성요소를 나타내며 비즈니스 로직을 처리 데 사용되고, @Repository는 데이터 계층의 구성요소를 나타내며 CRUD 작업을 처리하는 데 사용됩니다. 이러한 명확한 구분은 코드의 가독성과 유지 관리에 큰 도이 됩니다

 

 

[백엔드 개발자의 스프링 공부노트]

 

비즈니스 계층(Business Layer)이란 웹 애플리케이션을 개발할 때, 애플리케이션의 핵심적인 비즈니스 로직을 구현하고 관리하는 계층으로, 서비스 계층(Service Layer)이라고도 합니다. 웹 애플리케이션 구조를 계층화하여 컴포넌트 간의 의존성을 최소화하고 코드의 가독성과 유지 관리를 개선하기 위한 목적으로 사용됩니다. 

비즈니스 계층의 주요 역할은 다음과 같습니다:

  1. 비즈니스 로직 처리: 비즈니스 로직은 애플리케이션의 핵심 요구 사항을 만족하는 기능과 규칙을 구현합니다. 예를 들어, 인증, 결제 처리, 주문 관리, 계산 등의 로직이 포함됩니다.
  2. 데이터 접근 계층과의 인터페이스 제공: 비즈니스 계층은 데이터 접근 계층과의 인터페이스를 제공하며, 데이터 처리 작업을 데이터 계층에 위임합니다. 이를 통해 데이터 저장소의 변경에 대한 영향을 최소화할 수 있습니다.
  3. 트랜잭션 처리: 트랜잭션 처리는 여러 데이터 조작 작업을 원자성(Atomicity)을 보장하여 실행하는 과정입니다. 비즈니스 계층에서 애플리케이션 트랜잭션을 관리하며, 필요에 따라 롤백이나 커밋을 실행합니다.
  4. 보안 및 유효성 검사: 비즈니스 계층에서 입력 값 검증, 권한 확인 등의 보안 및 유효성 검사를 수행하여 애플리케이션의 안전성을 보장합니다.

Java Spring 프레임워크에서 @Service 어노테이션을 사용하여 비즈니스 계층을 나타내고 있으며, 해당 클래스는 비즈니스 로직 처리를 담당합니다. 주로 컨트롤러에서 호출되어 비즈니스 로직을 수행한 뒤, 결과를 컨트롤러에 전달합니다. 이렇게 계층화된 구조를 사용하면 코드의 가독성이 높아지고 유지 관리가 보다 쉬워집니다.

 

 

  1. 비즈니스 로직 (인증 예시)
java
@Service
public class AuthenticationService {
    @Autowired
    private UserRepository userRepository;

    public boolean authenticate(String email, String password) {
        User user = userRepository.findByEmail(email);
        if (user == null) {
            return false;
        }

        // 비밀번호 검증 로직 (해싱된 비밀번호를 비교하는 예)
        return passwordEncoder.matches(password, user.getHashedPassword());
    }
}
  1. 데이터 접근 계층과의 인터페이스 제공 (주문 관리 예시)
java
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByUserId(Long userId);
}

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;

    public List<Order> getOrdersByUserId(Long userId) {
        return orderRepository.findByUserId(userId);
    }
}
  1. 트랜잭션 처리 (계정 이체 예시)
java
@Service
public class AccountService {
    @Autowired
    private AccountRepository accountRepository;

    @Transactional
    public boolean transferMoney(Long senderId, Long recipientId, BigDecimal amount) {
        Account senderAccount = accountRepository.findById(senderId);
        Account recipientAccount = accountRepository.findById(recipientId);

        if (senderAccount == null || recipientAccount == null || senderAccount.getBalance().compareTo(amount) < 0) {
            return false;
        }

        senderAccount.setBalance(senderAccount.getBalance().subtract(amount));
        recipientAccount.setBalance(recipientAccount.getBalance().add(amount));

        accountRepository.save(senderAccount);
        accountRepository.save(recipientAccount);

        return true;
    }
}
  1. 보안 및 유효성 검사 (입력 값 검증 예시)
java
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User createUser(String email, String password) {
        if (email == null || password == null || !isValidEmail(email) || !isValidPassword(password)) {
            throw new IllegalArgumentException("Invalid email or password");
        }

        User user = new User();
        user.setEmail(email);
        user.setHashedPassword(passwordEncoder.encode(password));

        return userRepository.save(user);
    }

    private boolean isValidEmail(String email) {
        // 이메일 형식 확인 로직
    }

    private boolean isValidPassword(String password) {
        // 암호 복잡성 확인 로직
    }
}

위 코드 예시는 각 처리 분야에 해당하는 비즈니스 로직, 데이터 접근 계층과의 인터페이스 제공, 트랜잭션 처리, 보안 및 유효성 검사를 다루고 있습니다. 이러한 코드 구조는 기능별로 분리되어 있으므로 가독성이 높아지고 유지 관리가 용이해집니다.

 

 

 

 

 

 

#백엔드 #백엔드개발자 #백엔드개발자취업 #스프링부트 #개발자되기 #java백엔드 #개발자채용 #개발자면접 #백엔드스쿨 #백엔드개발자 #코딩공부 #프론트엔드개발자 #개발자노트북 #개발자 #스프링 #개발자팁 #앱개발자 #개발공부 #개발

댓글