일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 인프런
- Python
- 김영한
- Spring
- 스프링MVC
- inflearn
- java
- 자바연습문제
- 스프링
- REGEXP_SUBSTR
- JPA
- 스프링입문
- 불친절한SQL프로그래밍
- 자바의정석 연습문제
- 이것이자바다
- 분석함수
- 항해플러스 백엔드
- 자바공부
- 항해플러스
- Numpy
- 자바의정석
- 제네릭
- 스프링 핵심원리
- 불친절한 SQL 프로그래밍
- 시큐어코딩
- 서블릿
- Java의정석
- docker
- Secure Coding
- 스프링 부트와 JPA
- Today
- Total
목록분류 전체보기 (122)
Continuous Challenge
제네릭 메소드는 타입 파라미터를 가지고 있는 메소드를 말한다. public 리턴타입 메소드명(매개변수, ...) {...} 타입 파라미터가 메소드 선언부에 정의된다는 점에서 제네릭 타입과 차이가 있다. 제네릭 메소드는 리턴 타입 앞에 기호를 추가하고 타입 파라미터를 정의한 뒤, 리턴 타입과 매개변수 타입에서 사용한다. public Box boxing(T t) {...} boxing() 메소드는 타입 파라미터로 를 정의하고 매개변수 타입과 리턴 타입에서 T를 사용한다. (매개변수 : T, 리턴 타입 : T를 내용물로 갖는 Box 객체) 타입 파라미터 T는 매개값이 어떤 타입이냐에 따라 컴파일 과정에서 구체적인 타입으로 대체된다. public class Box { //필드 private T t; //Gett..
제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다. public class 클래스명 {...} public interface 인터페이스명 {...} 제네릭 타입은 선언부에 '' 부호가 붙고 그 사이에 타입 파라미터들이 위치한다. 타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다. 외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다. 만약 지정하지 않으면 Object 타입이 암묵적으로 사용된다. 클래스에서의 사용 예제 //제네릭 타입 public class Product { //필드 private K kind; private M model; //메소드 public K getKind() { ..
Box 클래스를 선언하려고 한다. Box의 내용물 content 필드를 선언하려고 할 때, 타입을 무엇으로 해야 할까? Box 는 다양한 내용물을 저장해야 하므로 특정 클래스 타입으로 선언할 수 없다. 그래서 Object 타입으로 선언한다. public class Box { public Object content; } Object 타입은 모든 클래스의 최상위 부모 클래스이다. 그렇기 때문에 content 필드에는 어떤 객체든 대입이 가능하다. 문제는 Box 안의 내용물을 얻을 때이다. content 는 Object 타입이므로 어떤 객체가 대입되어 있는지 알 수 없다. 이 때 대입된 내용물의 타입을 안다면 강제 타입 변환을 거쳐 얻을 수 있다. String content = (String) box.cont..
String 클래스 String 클래스는 문자열을 저장하고 조작할 때 사용한다. ex) 네트워크 통신으로 얻은 byte 배열을 원래 문자열로 변환하는 경우 //기본 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성 String str = new String(byte[] bytes); //특정 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성 String str = new String(byte[] bytes, String charsetName); import java.util.Arrays; public class BytesToStringExample { public static void main(String[] args) throws Exception { String data = ..
HTTP 요청 - 기본, 헤더 조회 MultiValueMap Map과 유사한데 하나의 키에 여러 값을 받을 수 있다. Http header, HTTP 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용한다. - keyA=value1&keyA=value2 참고 @Controller 의 사용 가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments @Controller 의 사용 가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다. https://docs.spring.io/spring-framework/docs/curre..
로깅 로깅 라이브러리 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리('spring-boot-starter-logging')가 함께 포함된다. SLF4J Logback 로그 라이브러리는 Logback, Log4J, Log4J2 등 수많은 라이브러리가 있는데 그것을 통합해서 인터페이스로 제공하는 것이 SLF4J 라이브러리이다. (쉽게 말해 SLF4J는 인터페이스이고 그 구현체로 Logback 같은 로그 라이브러리를 선택) 매핑 정보 @RestController - @Controller는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다. - @RestController는 반환 값으로 뷰를 찾는 것이 아니라 HTTP 메시지 바디에 바로 입력한다. 따라서 실행..
DispatcherServlet 스프링 MVC의 프론트 컨트롤러 부모 클래스에서 HttpServlet을 상속받아서 사용하고 서블릿으로 동작한다. 스프링 부트는 DispatcherServlet을 서블릿으로 자동으로 등록하면서 모든 경로에 대해서 매핑한다. 핸들러 조회 핸들러 어댑터 조회 핸들러 어댑터 실행 핸들러 실행 ModelAndView 반환 viewResolver 호출 View 반환 뷰 랜더링 핸들러 매핑과 핸들러 어댑터 @RequestMapping 가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping, RequestMappingHandlerAdapter 이다. @RequestMapping의 앞글자를 따서 만든 이름인데 이것이 바로 지금 스프링에서 주..
FrontController 패턴 특징 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출 입구를 하나로! 공통 처리 기능 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨 스프링 웹 MVC와 프론트 컨트롤러 스프링 웹 MVC의 핵심도 바로 FrontController 스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있음 ViewResolver 컨트롤러가 반환한 논리 뷰이름을 실제 물리 뷰 경로로 변경한다. 그리고 실제 물리 경로가 있는 MyView 객체를 반환한다. 어댑터 패턴 스프링MVC @RequestMapping("/hello") → RequestMappingHandl..
템플릿 엔진 템플릿 엔진에는 JSP, Thymeleaf, Freemarker, Velocity등이 있다. 템플릿 엔진을 사용하면 HTML 문서에서 필요한 곳만 코드를 적용해서 동적으로 변경할 수 있다. MVC 패턴 Model은 HttpServletRequest 객체를 사용한다. request는 내부에 데이터 저장소를 가지고 있는데, request.setAttribute(), request.getAttribute() 를 사용하면 데이터를 보관하고 조회할 수 있다. /WEB-INF 이 경로 안에 JSP가 있으면 외부에서 직접 JSP를 호출할 수 없다. 우리가 기대하는 것은 항상 컨트롤러를 통해 JSP를 호출하는 것이다. redirect vs forward 리다이렉트는 실제 클라이언트(웹 브라우저)에 응답이 ..
DI (Dependency Injection) 의존 관계 주입. 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입시켜주는 방식. 모듈 간의 결합도가 낮아지고 유연성이 높아진다. 외부에서 생성된 객체를 setter()를 통해 사용하는 방법 IoC (Inversion of Control) 제어의 역전. 제어의 흐름을 바꾼다. 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것. 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지보수를 편하게 할 수 있게 한다. → Bean들은 싱글턴 패턴의 특징을 가지며 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.