1. @RequestMapping과 @GetMapping의 차이점
- @RequestMapping:
- 기본 HTTP 요청 방식(GET, POST, PUT, DELETE 등)을 처리할 수 있는 포괄적인 어노테이션이다.
- 사용 예시: @RequestMapping("/example")
- 모든 HTTP 메서드를 처리할 수 있다. method 속성을 통해 GET, POST 등 다른 HTTP 요청 방식을 명시적으로 지정할 수 있다.
@RequestMapping(value = "/example", method = RequestMethod.GET) public String example() { return "example"; } - @GetMapping:
- @RequestMapping의 특화된 버전으로, HTTP GET 요청만 처리한다.
- @GetMapping은 HTTP 메서드가 GET일 때만 사용할 수 있다.
@GetMapping("/example") public String example() { return "example"; }
차이점:
- @RequestMapping은 다양한 HTTP 메서드(GET, POST 등)를 처리할 수 있는 범용적인 어노테이션이고, @GetMapping은 GET 요청만을 처리하는 데 특화되어 있다.
2. @Controller와 @RestController의 차이점
- @Controller:
- 웹 페이지 렌더링을 위한 컨트롤러로, 뷰를 반환하는 데 사용된다.
- ModelAndView 또는 **View**를 반환하여 템플릿 엔진(예: Thymeleaf)을 사용하여 HTML을 생성한다.
- HTML 파일을 반환할 때 사용된다.
@Controller public class MyController { @GetMapping("/example") public String example(Model model) { model.addAttribute("message", "Hello, World!"); return "example"; // example.html 반환 } } - @RestController:
- API 응답을 반환하는 컨트롤러로, JSON 또는 XML과 같은 데이터를 반환한다.
- 내부적으로 **@Controller와 @ResponseBody**를 결합한 것으로, 메서드가 반환하는 값은 자동으로 JSON으로 변환되어 HTTP 응답 본문에 담긴다.
@RestController public class MyRestController { @GetMapping("/api/example") public Map<String, String> example() { Map<String, String> response = new HashMap<>(); response.put("message", "Hello, World!"); return response; // JSON 형태로 반환 } }
차이점:
- @Controller는 뷰를 반환하고, @RestController는 JSON 형태의 데이터를 반환하는 데 사용된다.
3. SSR (Server Side Rendering)
SSR(서버 사이드 렌더링)은 서버에서 HTML을 생성하여 클라이언트에게 전달하는 방식이다. 클라이언트가 요청을 보내면 서버에서 HTML을 렌더링한 후 완성된 HTML을 반환하고, 클라이언트는 이 HTML을 바로 화면에 표시한다.
- 장점:
- 빠른 초기 로딩: 서버에서 렌더링된 HTML을 받으므로, 클라이언트 측에서 추가적인 렌더링을 기다릴 필요가 없다.
- SEO 최적화: 검색 엔진이 서버에서 이미 렌더링된 HTML을 쉽게 크롤링할 수 있어 SEO에 유리하다.
- 단점:
- 서버의 부하가 증가할 수 있다.
- 클라이언트 상호작용이 많아지면, 다시 서버에서 렌더링된 페이지를 받아오는 방식은 비효율적일 수 있다.
4. 조건문에서 && 앞뒤 순서 중요
&&는 논리 AND 연산자로, 두 조건이 모두 참일 때만 전체 조건이 참이다. 이 연산자는 왼쪽부터 오른쪽으로 차례대로 평가된다. 그리고 첫 번째 조건이 거짓이라면, 뒤의 조건은 평가하지 않는다(단락 평가).
예를 들어:
if (x > 5 && y < 10) {
// x가 5보다 크고 y가 10보다 작은 경우 실행
}
- 만약 x > 5가 false일 경우, y < 10은 평가하지 않고 false를 반환한다.
- 따라서 앞에 조건이 거짓일 경우 뒤 조건을 평가하지 않기 때문에 순서가 중요하다.
5. 탐욕 정렬 (Greedy Algorithm)
탐욕 정렬은 매 선택에서 가장 최선의 선택을 하여 문제를 해결하는 알고리즘이다. 전체적으로 최적해를 구하는 것이 아니라, 각각의 단계에서 가장 좋은 선택을 하여 결과를 얻는다.
예시:
- 동전 문제: 주어진 금액을 만들기 위해 가장 큰 동전부터 차례로 사용하는 방식이 탐욕 알고리즘이다.
- 예를 들어, 99원을 만들 때 50원, 20원, 10원, 5원, 1원을 사용하는 방식이 바로 탐욕 정렬이다.
단점:
- 탐욕 정렬은 최적 해법을 보장하지 않을 때도 있다. 모든 문제에 최적의 해결책을 보장하지 않기 때문에, 사용할 때 주의해야 한다.
6. 알고리즘
- 알고리즘은 문제를 해결하는 구체적인 절차나 방법이다. 주어진 문제를 해결하기 위해 컴퓨터가 따라야 할 단계별 명령을 정의한 것이다.
- 알고리즘의 종류로는 정렬, 탐색, 동적 계획법, 그리디 알고리즘, 분할 정복 등이 있다.
7. 순열은 무조건 재귀
순열(Permutation)은 주어진 원소들을 특정 순서대로 배열하는 방법이다. 순열을 구하는 알고리즘은 보통 재귀 방식을 사용한다. 왜냐하면, 순열은 부분 문제를 풀어서 전체 문제를 해결할 수 있기 때문이다.
예시:
- 주어진 3개의 숫자 1, 2, 3에 대해 가능한 순열을 구할 때, 재귀적으로 한 가지 숫자를 선택하고 나머지 숫자들로 다시 순열을 구하는 방식으로 해결할 수 있다.
public class Permutation {
public static void generatePermutations(int[] nums, int start) {
if (start == nums.length) {
// 순열을 출력
System.out.println(Arrays.toString(nums));
return;
}
for (int i = start; i < nums.length; i++) {
// 스왑
swap(nums, start, i);
generatePermutations(nums, start + 1);
swap(nums, start, i); // 백트래킹
}
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
'spring > [실습] 솔로프로젝트' 카테고리의 다른 글
| 2024-07-30 (0) | 2024.07.30 |
|---|---|
| 2024-07-18 일의 솔로 프로젝트 중간 점검 설계 (0) | 2024.07.18 |
| 까먹으면 안되는 것 - 추가 (0) | 2024.07.18 |
| URI 메서드 어떻게 쓰는데 (0) | 2024.07.18 |
| 2일차 (0) | 2024.07.12 |