본문 바로가기

전체 글160

[effective java] item 26. 로 타입은 사용하지 말라 결론 로 타입은 런타임 에러를 발생시키므로 사용하면 안 됩니다. 매개변수화 타입인 Set나 비한정적 와일드 카드 타입인 Set은 컴파일 에러를 발생시켜 더 안전하므로, 로 타입인 Set 대신 사용하는 것이 좋습니다. 설명 용어 정리 제네릭 클래스 / 제네릭 인터페이스 클래스와 인터페이스 선언에 타입 매개변수(type parameter)가 쓰이면, 이를 제네릭 클래스 혹은 제니릭 인터페이스라 합니다. ex) List List 인터페이스는 원소의 타입을 나타내는 타입 매개변수 E를 받습니다. 그래서 이 인터페이스의 완전한 이름은 List지만, 짧게 그냥 List라고도 자주 씁니다. 제네릭 타입(generic type) 제네릭 클래스와 제네릭 인터페이스를 통틀어 지칭하는 말입니다. 매개변수화 타입(parame.. 2023. 8. 28.
[effective java] 제 5장. 제네릭 (들어가기 전에, 용어 정리) 들어가기 전에 제네릭은 자바 5부터 사용할 수 있습니다. 제네릭을 지원하기 전에는 컬렉션에서 객체를 꺼낼 때마다 형변환을 해야 했습니다. 그래서 누군가 실수로 엉뚱한 타입의 객체를 넣어두면, 런타임에 형변환 오류가 나곤 했습니다. 반면, 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에게 미리 알려주어 컴파일러가 엉뚱한 타입의 객체를 넣으려는 시도를 컴파일 과정에서 차단하여 더 안전하고 명확한 프로그램을 만들 수 있습니다. 또한, 컴파일러가 알아서 형변환 코드를 추가해주기도 합니다. 이번 장에서 제네릭의 이점을 최대한 살리고 단점을 최소화하는 방법을 알아봅시다. 용어 정리 한글 용어 영문 용어 예 매개변수화 타입 parameterized teype List 실제 타입 매개변수 actual typ.. 2023. 8. 28.
[effective java] item 25. 톱 레벨 클래스는 한 파일에 하나만 담으라 결론 한 개의 소스 파일에는 한 개의 톱 레벨 클래스를 담자. 이 규칙을 따르면 한 클래스에 대해 여러 개의 정의를 만들어내는 일이 사라져 안전합니다. 만약, 굳이 여러 개의 톱 레벨 클래스를 한 개의 소스파일에 담고 싶다면 정적 멤버 클래스를 고민해봅시다. 설명 소스 파일 하나에 톱 레벨 클래스를 여러 개 선언해도, 컴파일러는 아무런 경고조차 내지 않습니다. 하지만 이럴 경우 아무런 장점도 없고, 오히려 컴파일 에러를 내고 출력 결과가 달라지는 등 위험을 일으킬 수 있습니다. 왜냐하면 한 클래스를 여러 가지로 정의하게 되게 되고, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문입니다. [예제] 한 소스 파일에 2개의 톱 레벨 클래스 Utensil.java : "panc.. 2023. 8. 28.
[SpringBoot] HTTP 응답 관련 애노테이션 목차 응답 데이터 반환의 종류 스프링(서버)에서 HTTP 응답 데이터를 만드는 방법은 다음과 같이 크게 3가지입니다. 정적 리소스 : 정적 HTML, CSS, JS 뷰 템플릿 사용 : 동적인 HTML HTTP Message Body에 직접 입력 (단순 텍스트 / JSON) 전체 구조 HTTP 응답 - 정적 리소스, 뷰 템플릿 정적 리소스 스프링 부트의 src/main/resources 는 리소스를 보관하는 곳이고, 클래스패스의 시작 경로입니다. 스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공합니다. /static, /public, /resources, /META-INF/resources 따라서, 해당 디렉토리에 리소스를 넣어두면, 스프링 부트가 정적 리소스로 서비스를 제공합니다. 예제.. 2023. 8. 25.
[SpringBoot] HTTP 요청 조회 애노테이션 목차 전체 구조 HTTP 요청 매핑 회원 관리 HTTP API를 만든다 생각하고 매핑을 어떻게 하는지 알아봅시다. (URL 매핑에만 집중합니다.) 회원 관리 API 회원 목록 조회: GET /users 회원 등록: POST /users 회원 조회: GET /users/{userId} 회원 수정: PATCH /users/{userId} 회원 삭제: DELETE /users/{userId} @RestController @RequestMapping("/mapping/users") public class MappingController { /** * 회원 목록 조회 * GET /mapping/users */ @GetMapping public String users() { return "get users"; } .. 2023. 8. 25.
[SpringBoot] 스프링 MVC 기본 애노테이션(@Controller, @RequestMapping, @PathVariable) 목차 @Controller @Controller //컴포넌트 스캔을 통해 스프링 빈으로 등록 public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } } @Controller 스프링이 자동으로 스프링 빈으로 등록합니다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔 대상이 됩니다.) 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식됩니다. @RequestMapping 해당 URL이 호출되면, 이 메서드가 호출됩니다. 다중 설정이 가능합니다. {"/hell.. 2023. 8. 25.