Mapping

@RequestMapping

@RequestMapping은 URL을 Controller의 Method와 매핑할 때 class 레벨에서 사용합니다…

@RequestMapping("/api/user")

client가 URL로 요청을 전송하고, 요청 URL을 어떤 method가 처리할지를 결정합니다…

@GetMapping && @PostMapping && @DeleteMapping && @PutMapping

get || Post || Delete || Put 요청 방식으로 통신하고자 할때 사용하는데,

@RequestMapping(method=RequestMethod.GET||POST||DELETE||PUT...)

와 같은 효과를 낸다. (method 레벨에서 사용)

UnsatisfiedDependencyException

일부 Bean 또는 property dependency가 충족되지 않으면 발생하는 에러…

저는 어노테이션을 빼먹어서 이 에러가 떴네요..

별거아니지만 다른 경우에도 많이 뜨는 에러길래…

이 에러가 왜 발생하는지 설명해준 영어 사이트가 있는데 괜찮길래 번역해봅니다…
예를 들어 다음 코드들이 하나의 패키지 안에 존재할때 spring boot 어플리케이션을 실행하면 모든 것이 순차롭게 작동합니다.

public interface InventoryRepository {
}
@Repository
public class ShoeRepository implements InventoryRepository {
}
@Service
public class PurchaseDeptService {
    public PurchaseDeptService(InventoryRepository repository) {
        this.repository = repository;
    }
}
@SpringBootApplication
public class SpringDependenciesExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDependenciesExampleApplication.class, args);
    }
}

하지만 구성 단계를 건너뛰면 UnsatisfiedDependencyException 에러가 발생하는데요, 예를들어 component 주석을 누락하면

public class ShoeRepository implements InventoryRepository{

}

UnsatisfiedDependencyException: Error creating bean with name ‘purchaseDeptService’: Unsatisfied dependency expressed through constructor parameter 0 라는 오류 메시지가 뜨게 됩니다.

spring은 ShoeRepository Bean을 연결하고 이를 application context에 추가하도록 지시받지 못했기 때문에 이를 inject할 수 없고, 따라서 예외가 발생하게 된 것입니다.

또 한가지 예로, non-unique dependency가 있습니다. 다음과 같이 DressRepository를 추가했다고 합시다.

@Repository
public class DressRepository implements InventoryRepository {
}

이 때 app을 실행시키면 또 UnsatisfiedDependencyException 에러가 뜨게됩니다. 그러나 이번에는 상황이 다릅니다. 종속성을 만족하는 Bean이 하나를 초과할 때 종속성을 해결하지 못합니다.

다음과 같은 문제를 해결하기 위해 @Qualifier를 추가하여 저장소를 구분할 수 있습니다.

@Qualifier("shoes")
@Repository
public class ShoeRepository implements InventoryRepository {
}
@Qualifier("dresses")
@Repository
public class DressRepository implements InventoryRepository {
}

또한 PurchaseDeptService Constructor dependency에 한정자를 추가합니다.

public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) {
    this.repository = repository;
}

session

session에 저장된 데이터 갖고오기

-> session.getAttribute(“저장한 변수명”);

session에 데이터 저장하기

-> session.setAttribute(“저장하고자 하는 변수명”, 저장변수값);

session 초기화하기

-> session.invalidate();

느낀점..

Springboot구조.. 처음에 봤을땐 저게뭐시당가 싶었지만 직접 만들어보니 각자 뭔 역할을 맡았는지 이해가됩니다…

그리고 주의할점.. 어노테이션 빼먹지 않기…… 이상한데서 시간 안날리기..

그리고 스프링 공부를 굉장히 많이 해야겠다는 생각…

500번 에러가 많이뜬다…….

OTL