페이지 전체를 보내주는 방식은 CSR, Server에서 Data만을 보내주는 것을 SSR이라고 막연하게 공부하다가 동기/비동기 요청에 대한 내용과 헷갈리며 길을 잃게되어 따로 찾아보게되었다.
Client Side Rendering으로 Client API에서 웹 페이지에 대한 내용을 Rendering 한다는 것을 의미한다. 즉, Server에서 보내주는 정적인 Resource들을 한 번에 다운로드 한 뒤 추후에 요청이 들어올 시 page를 전달 받아 일부분을 Update 하는 방식의 Rendering으로 하나의 페이지를 전달하는 application을 SPA(Single Page Application) 이라고 일컫는다.
Server Side Rendering으로 Server API에서 웹 페이지의 전체에 대한 내용을 요청 때 마다 보내줄 수 있도록 정적인 Resource를 지속적으로 보내주는 전통적인 Web Application 구현 방식을 일컬으며 즉, Data의 갯수(page 갯수)에 따라 SSR의 경우 대체적으로 MPA(Multi Page Application)의 경우 주로 사용된다.
구분 | CSR | SSR |
---|---|---|
장점 | - Data만 전달 받아 Client에서 Rendering하기 때문에 깜빡임이 없음 - 정적인 Resource를 받아오는 초기 로딩 이후 구동 속도가 SSR 대비 빠르다. - Server의 역할을 분담하여 Cleint API가 Rendering 하기 때문에 서버 부하의 분산이 이뤄진다. | - 초기 구동 속도가 CSR 방식 대비 빠르다. - 검색엔진 최적화(SEO)에 이점에 있음 |
단점 | - 초기 구동 속도가 SSR 대비 다소 느린 편이다 - 검색엔진 최적화(SEO)를 위하여 추가 보완 작업이 필요함 | - 초기 페이지 로딩 이후 페이지 전환(request) 시 다소 속도가 느리다. |
"Ajax = CSR = 쾌적한 UI 제공" 이라고 막연하게만 알고 있던 내용에 대하여 다시 공부하게 되자, 통신 흐름에 대하여 다시 이해할 수 있게 되었다. 더불어, WebSocket에 대해 공부하며 의문이 들었던 일부분만 Data를 전송하여 일부 page에 대해서만 Update하는 방식이 가능한지에 대해 의문점을 가졌던 부분에 대해서도 해소할 수 있게 되었다.
@Controller
: Spring MVC 컨트롤러 클래스에 사용되며, 해당 클래스가 웹 요청을 처리하는 컨트롤러임을 나타냄
@Service, @Repository, @Component
: 각각 서비스, 리포지토리(DAO), 일반 컴포넌트를 정의할 때 사용되는 annotation으로 Spring 컨테이너에 빈으로 등록된다.
@RestController
: @Controller와 @ResponseBody를 합쳐놓은 것으로, JSON 또는 XML 형태의 응답을 직접 반환(ViewResolver에게 전달하지 않고 값(객체)을 전달함)하는 RESTful 컨트롤러를 정의할 때 사용됨
@RequestMapping
: 요청 URL과 메서드를 매핑할 때 사용되며, 클래스 레벨이나 메서드 레벨에서 사용할 수 있다. HTTP 메서드별로 처리할 수 있다.
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
: 각각 HTTP GET, POST, PUT, DELETE, PATCH 메서드에 대한 Mapping을 간편하게 설정할 수 있는 annotation
@RequestParam
: HTTP 요청 파라미터를 메서드의 매개변수로 전달받을 때 사용되며, 필수 여부나 기본값 등을 설정할 수 있다.
@ModelAttribute
: 모델 객체를 메서드 매개변수로 받을 때 사용되며, 요청 처리 전에 모델 객체를 준비할 수 있게 설정함
@RequestMapping("/demo/playdemo.do")
public String Demo playDemo(@ModelAttirubte(name="demo") Demo d, Address address){
demo.setAddress(address);
return "demo/demoResult";
}
@Aspect
: AOP를 구현하기 위한 aspect 역할을 한다는 것을 명시하기 위한 Annotation
@Pointcut, @After, @Before, @Around
: AOP를 구현하기 위해 필요한 설정으로 어떠한 메소드에 적용할 것(Target에 대한 설정)인가에 대해 @Pointcut으로 설정 후, 설정된 메소드의 실행 전에 Aspect 클래스의 메소드를 실행할 것인지, 후에 실행할 것인지 혹은 앞/뒤로 실행할 것인지에 대해 설정하는 Annotation
@AfterThrowing
: Exception 발생 시 실행하는 AOP
@Aspect
@Component
@Slf4j
public class AspectTest {
@Pointcut("excution(* com.mj.spring.demo..*(..))")
public void test(){ }
@Before(test())
public void aopBeforeMethod(){
System.out.println("Hello, Nice to meet you :D");
}
@AfterThrowing(value="within(com.mj.spring.demo..controller.*)", throwing="e")
public void aopAfterThrwoingMethod(JoinPoint jp, Throwable e){
Signature sig = jp.getSignature();
log.error("Exception 발생 !");
log.error("예외 발생 메소드 : " + sig.getDeclaringTypeName()+"."+sig.getName());
log.error("예외 메세지 : " + e.getMessage());
}
}
@RequestBody
: HTTP 요청의 본문(body)을 자바 객체로 매핑할 때 사용되며 주로 POST 요청에서 JSON 데이터를 받을 때 많이 사용된다.
@ResponseBody
: 메서드가 반환하는 객체를 HTTP 응답 본문으로 직접 전송할 때 사용됩니다. 주로 @RestController 클래스에서 사용됩니다.
@RequestMapping("/demo/demoreturn.do")
public @ResponseBody Demo dataReturn(){
return Demo.builder().devName("KMJ").build();
}
@Autowired
: 의존성 주입을 수행할 때 사용되며, 필드, 생성자, 메서드에 적용할 수 있다.
@Qualifier
: 의존성 주입 시 빈을 선택할 때 사용되며, 여러 후보 빈 중에서 명시적으로 어떤 빈을 주입할지 지정해주는 역할의 Annotation
@Controller
public class BeanController{
@Autowired
@Qualifier("wandubean")
private final Bean bean;
private final NoBean nbean;
public BeanController(@Autowired Bean bean, @Autowired(required=false) NoBean nbean){
super();
this.bean = bean;
this.nbean = nbean;
}
}
@ExceptionHandler
: 예외 처리를 위한 메서드에 적용되며, 특정 예외가 발생했을 때 메서드가 호출되어 예외를 처리할 수 있다.
@Transactional
: Transaction 처리를 위한 Annotation 방식의 선언으로 RuntimeException 발생 시 rollback 처리를 한다.
@Configuration, @Bean
: Java 설정 클래스와 그 메서드가 빈을 정의할 때 사용한다. @Configuration은 설정 클래스에, @Bean은 해당 메서드에 적용한다.
@EnableWebMvc
: @Configuration 설정이 붙은 클래스에 주로 @Enable로 시작하는 Annotation을 붙혀 사용하는데, @EnalbeWebMvc의 경우 Spring이 제공하는 Web과 관련된 최신 전략 Bean들을 등록 해준다.
@Coniguration
@EnableWebMvc
public class AnnotationTest {
}
@Value
: 외부 설정 파일의 값을 주입받을 때 사용된다.
@Primary
: 여러 후보 빈 중에서 주요 빈을 선택할 때 사용된다. 자동 주입 시(Autowired)에 우선적으로 선택된다
@RequestHeader
: HTTP 요청 헤더 값을 메서드 매개변수로 전달받을 때 사용된다. 즉, 특정 헤더의 값을 가져올 수 있다.
@CookieValue
: HTTP 쿠키 값을 메서드 매개변수로 전달받을 때 사용된다. 즉, 특정 쿠키의 값을 가져올 수 있다.
@SessionAttributes
: 세션에 속성(attribute)을 저장할 때 사용된다. 컨트롤러 클래스 또는 메서드에 적용하여 세션에 저장할 모델 속성을 지정할 수 있다.
@PathVariable
: URL 경로에서 변수를 추출하여 메서드의 매개변수로 전달받을 때 사용된다.
@ConfigurationProperties
: 설정 파일의 property 값을 자바 객체에 Mapping할 때 사용되며, application.properties나 application.yml 등의 설정을 binding할 수 있다.
@Async
: 비동기 메서드로 지정할 때 사용되며, 메서드가 별도의 thread에서 실행될 수 있도록 설정한다.
@EnableScheduling
: 스케줄링 기능을 활성화할 때 사용되며, @Scheduled annotation을 사용하여 주기적으로 메서드를 실행할 수 있게 한다.
@InitBinder
: 폼 데이터 binding을 커스터마이징할 때 사용되며, 컨트롤러에서 데이터 binding 초기화 코드를 설정할 수 있다.
@Cacheable, @CacheEvict, @CachePut
: 메서드의 결과를 캐시에 저장하거나 캐시에서 삭제할 때 사용되는 annotation들로 스프링의 캐싱 추상화를 지원한다.
@Scheduled
: 주기적으로 메서드를 실행할 때 사용되며, cron 표현식이나 고정된 시간 간격으로 메서드를 실행할 수 있다.
@CrossOrigin
: CORS(Cross-Origin Resource Sharing) 설정을 추가할 때 사용되며, 특정 요청에 대해 허용할 오리진을 설정할 수 있다.
@Entity, @Table, @Column
: JPA에서 엔티티 클래스를 정의할 때 사용되는 annotation들로 각각 클래스, 테이블, 컬럼을 정의하는데 사용한다.
@TransactionalEventListener
: 트랜잭션 이벤트를 처리할 때 사용되며, 특정 트랜잭션이 완료될 때 이벤트를 처리하는 메서드를 지정할 수 있다.
@Profile
: 특정 환경이나 프로파일에 따라 빈을 등록하거나 제외할 때 사용됩니다. @Configuration 클래스나 @Component 클래스에 적용할 수 있다.
@Lazy
: 빈을 필요할 때까지 초기화를 지연시킬 때 사용되며 Spring bean이 처음 요청될 때 생성된다.
@RestControllerAdvice
: @ControllerAdvice와 @ResponseBody를 합친 것으로, RESTful 웹 서비스에서 전역적으로 예외 처리를 담당하는 컨트롤러 어드바이스를 정의할 때 사용된다.
@PathVariableMap
: 경로 변수들을 Map 형태로 받을 때 사용된다. 요청 URL에서 여러 경로 변수들을 한번에 가져올 수 있다.
@InitBinder
: 폼 데이터 바인딩을 커스터마이징할 때 사용되며 컨트롤러 내에서 특정 타입의 데이터 바인딩 초기화 코드를 설정할 수 있다.
@ExceptionHandler
: 예외 처리를 위한 메서드에 적용되며, 특정 예외가 발생했을 때 메서드가 호출되어 예외를 처리한다.
@ControllerAdvice
: 모든 컨트롤러에 적용되는 공통의 기능을 제공하는 어드바이스를 정의할 때 사용된다. 예를 들어, 전역적인 예외 처리나 모든 컨트롤러에 적용할 설정을 할 수 있다.
@CrossOrigin
: CORS(Cross-Origin Resource Sharing) 설정을 추가할 때 사용된다. 특정 요청에 대해 허용할 오리진(origin)을 설정할 수 있다.