WIL #24. 06. 22

LUNIA·2024년 6월 22일
0

Weekly I Learned(WIL)

목록 보기
1/4
post-thumbnail

(1) CSR, SSR

문제사항

페이지 전체를 보내주는 방식은 CSR, Server에서 Data만을 보내주는 것을 SSR이라고 막연하게 공부하다가 동기/비동기 요청에 대한 내용과 헷갈리며 길을 잃게되어 따로 찾아보게되었다.

정의

  • CSR ?

    Client Side Rendering으로 Client API에서 웹 페이지에 대한 내용을 Rendering 한다는 것을 의미한다. 즉, Server에서 보내주는 정적인 Resource들을 한 번에 다운로드 한 뒤 추후에 요청이 들어올 시 page를 전달 받아 일부분을 Update 하는 방식의 Rendering으로 하나의 페이지를 전달하는 application을 SPA(Single Page Application) 이라고 일컫는다.

  • SSR ?

    Server Side Rendering으로 Server API에서 웹 페이지의 전체에 대한 내용을 요청 때 마다 보내줄 수 있도록 정적인 Resource를 지속적으로 보내주는 전통적인 Web Application 구현 방식을 일컬으며 즉, Data의 갯수(page 갯수)에 따라 SSR의 경우 대체적으로 MPA(Multi Page Application)의 경우 주로 사용된다.

이미지 출처: https://miracleground.tistory.com/entry/SSR%EC%84%9C%EB%B2%84%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81%EA%B3%BC-CSR%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81

구분CSRSSR
장점- Data만 전달 받아 Client에서 Rendering하기 때문에 깜빡임이 없음
- 정적인 Resource를 받아오는 초기 로딩 이후 구동 속도가 SSR 대비 빠르다.
- Server의 역할을 분담하여 Cleint API가 Rendering 하기 때문에 서버 부하의 분산이 이뤄진다.
- 초기 구동 속도가 CSR 방식 대비 빠르다.
- 검색엔진 최적화(SEO)에 이점에 있음
단점- 초기 구동 속도가 SSR 대비 다소 느린 편이다
- 검색엔진 최적화(SEO)를 위하여 추가 보완 작업이 필요함
- 초기 페이지 로딩 이후 페이지 전환(request) 시 다소 속도가 느리다.

느낀점

"Ajax = CSR = 쾌적한 UI 제공" 이라고 막연하게만 알고 있던 내용에 대하여 다시 공부하게 되자, 통신 흐름에 대하여 다시 이해할 수 있게 되었다. 더불어, WebSocket에 대해 공부하며 의문이 들었던 일부분만 Data를 전송하여 일부 page에 대해서만 Update하는 방식이 가능한지에 대해 의문점을 가졌던 부분에 대해서도 해소할 수 있게 되었다.

(2) Spring Legacy Annotation

수업을 통해 배운 Annotation

@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)을 저장할 때 사용된다. 컨트롤러 클래스 또는 메서드에 적용하여 세션에 저장할 모델 속성을 지정할 수 있다.

추가로 찾아본 Annotation

@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)을 설정할 수 있다.

profile
꾸준한 노력으로 문제를 해결하는 자기 주도적 개발자의 Velog입니다.

0개의 댓글