-
TIL 18일차(2021.11.8)TIL(Today I Learned) 2021. 11. 8. 11:02
cmd창에서 java file 실행하기
java file의 directory로 이동
-> gradlew build
-> build folder 안에 있는 lib folder로 이동
-> file이 jar형식이면 java -jarfile name
으로 실행 완료!+번외
build를 완전히 지우고 다시 받고 싶으면
gradlew clean build
MVC란?
과거에는 View와 Controller를 분리하지 않고 하나의 View File에 몰아서 코딩했었는데, 현재는
View와 Controller를 분리하는것이 기본이 되었다.Tip!
Thymeleaf는 파일 링크만 복사해도 서버가 필요없이 내용을 확인할 수 있다는 장점이 있다.(물론 동적인 파일에는 의미가 없다.)
html이나 java 파일이 text파일로 자동 변환될 때 해결 방법
ctrl + alt + s 를 누르면 위 사진 처럼 뜨는데 파일이 등록되어있다면 '-' 기호를 눌러주면 해결!
노트북 getter and setter 생성 방법
- fn + alt + insert
// MVC방식 // RequestParam("name") String name -> 사용자가 입력하는 파라미터 값이 name에 저장 // 주소?name=`name`으로 name에 저장된 값 출력 @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model){ model.addAttribute("name", name); return "hello-template"; }
// 문자 방식(StringConverter 방식) // tomcat방식이 아니어서, template name을 지정해주지 않음, 클라이언트 출력시에도 설정한 값만 출력되고 소스코드는 출력 @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name){ return "hello " + name; //"hello spring" }
// API 방식(객체 response) @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name){ Hello hello = new Hello(); hello.setName(name); return hello; } static class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
- API방식은 키 값 쌍으로 이뤄진 JSON 방식
- getter and setter 방식은 java bin 방식, properties 방식이라고도 한다.
- ResponseBody가 붙어 있으면 controller에서 viewResolver로 가지 않고, HttpMessageConverter로 던져준다.
- HttpMessageConverter는 JsonConverter와 StringConverter이 외에 몇가지가 있는데 주로 이 두가지를 다룬다.
- 기본 문자 처리는
StringHttpMessageConverter
, 기본 객체 처리는MappingJackson2HttpMessageConverter
로 처리한다. - 정리 : 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서
HttpMessageConverter
가 결정된다.
웹 애플리케이션 계층구조
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비즈니스 로직 구현(회원 중복 방지와 같은)
- 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인 : 비즈니스 도메인 객체 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
Optional
값이 Null일 때 Optional로 감싸서 반환해주는 기능을 의미
HashMap
Map 인터페이스를 구현한 대표적인 Map 컬렉션으로 키와 값으로 이뤄져있다. 검색 속도가 빠르다는 특징이 있다.
put(키, 값)으로 값을 넣고, get(키)로 값을 반환할 수 있다. HashMap은 값은 중복이 가능하지만 키는 중복이 불가능하다.
만약 키가 중복될 경우 새롭게 설정된 키 값으로 치환된다.선언 방식
private static Map<Long, Member> store = new HashMap<>(); @Override public Member save(Member member){ member,setId(++sequence) //id는 컴퓨터에서 자동으로 생성, ++sequence로 id 값이 1,2,3.. store.put(member.getId(), member); return member; }
람다 객체(유튜브 낭궁성의 정석코딩 참고)
lambda식 : 함수(메서드를 간단한 )를 간단한 '식(expression)'으로 표현하는 방법
익명 함수(이름이 없는 함수)
반환 타입, 이름을 삭제,
화살표를 추가
반환값이 있는 경우, 식이나 값만 적고 return문 생략가능 세미콜론(;)도 생략가능
매개변수 타입이 추론 가능하면 생략가능(대부분의 경우 생략가능)
매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)
블록 안의 문장이 하나뿐 일 때, 괄호{}생략가능 단, 하나뿐인 문장이 return문이면 괄호{}생략불가
람다는 익명 함수가 아니라 익명 객체이다.
람다식(익명 객체)을 다루기 위한 참조변수가 필요.
함수와 메서드의 차이
근본적으로 동일
함수는 클래스에 독립적, 메서드는 클래스에 종속적,
메서드는 객체지향개념 용어
함수는 일반적 용어
@Override // lambda사용 public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); }
- .filter(member -> member.getName().equals(name)) //member에서 name이 같은것은 filter로 걸러줌.
- .findAny(); store list를 한번 다 훑어보고 하나라도 있으면 아무거나 가져옴
- 만약 하나도 없으면 Optional로 null값 반환.
Getter and Setter
Getter and Setter를 사용하는 이유는 무결성을 지키기 위함!
무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는것!
예) 사과의 갯수는 음수가 될 수 없다.(무결성 보증)implements shortcut key
alt + enter
함수형 인터페이스
함수형 인터페이스 : 단 하나의 추상 메서드만 선언된 인터페이스
- @FunctionalInterface로 하나의 추상메서드만 갖도록 설정
'TIL(Today I Learned)' 카테고리의 다른 글
TIL 20일차 (2021.11.10) (0) 2021.11.10 TIL 19일차(2021.11.09), 단축키 TIP 모음, intellij create git (0) 2021.11.09 TIL 17일차(2021.11.07) (0) 2021.11.07 markdown이란? (0) 2021.11.03 VSCode Extensions 를 이용한 Python 개발 (0) 2021.11.01