Open gmlwjd9405 opened 5 years ago
Edwith 강의 참고
- 자바스크립트의 선언 방식변수의 종류를 확인한다.
- var과 let, const의 차이에 대해 이해한다.
- 자바스크립트의 연산자의 종류 및 개념을 이해한다.
- 자바스크립트의 타입의 종류를 확인한다.
- 자바스크립트에서 type 체크 방법에 대해 이해한다.
- 자바스크립트에서 null 체크 방법에 대해 이해한다.
function
이라는 키워드를 사용하지 않고 =>
로 대체할 수 있다.function
키워드 생략 및 return 생략 가능
var materials = [
'Hydrogen',
'Helium',
'Lithium',
'Beryllium'
];
materials.map(function(material) { // 익명 함수 return material.length; }); // [8, 6, 7, 9]
materials.map((material) => { // function 생략 return material.length; }); // [8, 6, 7, 9]
materials.map(({length}) => length); // return 및 {} 생략 // [8, 6, 7, 9]
### 화살표 함수의 특징
- 화살표 함수는 항상 익명이다.
- 매개변수가 하나인 경우 괄호는 선택사항이다. 하지만 매개변수가 없는 경우엔 반드시 괄호를 적어야 한다.
```js
// 매개변수가 하나뿐인 경우 괄호는 선택사항
(singleParam) => { statements }
singleParam => { statements }
// 매개변수가 없는 함수는 괄호가 필요
() => { statements }
객체 리터럴 표현을 반환하기 위해서는 함수 본문(Body)을 괄호에 넣어야 한다.
var func = () => {foo: 1};
func(); // "undefined"
var func = () => {foo: function() {}};
func(); // SyntaxError: function 문은 이름이 필요함
params => ( {foo: bar} ) // 정상 작동
매개변수와 화살표 사이에 개행 문자를 넣을 수 없다.
var func = ()
=> 1;
// SyntaxError: expected expression, got '=>'
// ES5 익명 함수표현식 (function expression)
var sum = function(a, b) {
return a + b;
};
// ES6 화살표 함수 이용
var sum = (a, b) => {
return a + b;
}
sum (10, 20);
// ES5 함수선언문 (function declaration)
function getName(name) {
return "Kim " + name ;
}
// ES6 화살표 함수 이용
var getName = (name) => "Kim " + name;
var getName = name => "Kim " + name;
var arr = ["a", "b", "c"];
// ES5
arr.forEach(function(value){ // 익명 함수
console.log(value); // a, b, c
});
// ES6 화살표 함수 이용
arr.forEach(value => console.log(value)); // a, b, c
객체의 속성을 메서드로 사용할 때 function
예약어를 생략하고 생성이 가능하다.
// 객체
var dictionary = {
words: 100,
/* 속성 메서드: 속성에 function을 연결 */
// ES5
lookup: function() {
console.log("find words");
},
// ES6 - ': funtion' 생략
lookup() {
console.log("find words");
}
};
객체의 속성명과 값 명이 동일할 때 아래와 같이 축약이 가능하다.
var figures = 10;
var dictionary = {
// figures: figures,
figures
};
0(숫자): 라인 맨 앞으로 커서 이동 관련 포스트 추가 vim 연습 도구 추가 [ctrl + v]: 사각형의 블럭지정이 가능하다. 기능 확인 후 (멀티 포커스로 이름 변경) 오른쪽으로 tabn , tabnext gt 왼쪽으로 tabp , :tabprevious gT
정렬 수정 캡처 다시 확인 화살표 변경 단어 단위로 여러 줄 선택 링크 확인 참고 Debugger 탭 설명 위치 변경 단축키 내용 Bold 처리
@SpringBootApplication is a convenience annotation that adds all of the following:
@Configuration tags the class as a source of bean definitions for the application context.
@EnableAutoConfiguration tells Spring Boot to start adding beans based on classpath settings, other beans, and various property settings. For example, if spring-webmvc is on the classpath this flags the application as a web application and activates key behaviors such as setting up a DispatcherServlet.
@ComponentScan tells Spring to look for other components, configurations, and services in the hello package, allowing it to find the controllers.
Member member = new Member();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member); // 역방향(주인이 아닌 방향)에만 연관관계 설정
em.persist(team);
Member member = new Member();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// team.getMembers().add(member); // 역방향(주인이 아닌 방향)에만 연관관계 설정
member.setTeam(team); // 주인에 연관관계를 설정해야 함
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
em.persist(member);
member.setTeam(team); //** 연관관계의 주인에 값 설정
// 이 설정 없이도 "지연 로딩"을 통해서 아래에서 findTeam.getMembers에 접근 가능
// team.getMembers().add(member); //** 역방향에 연관관계 설정
// --- TEAM_ID(FK)가 설정되어 있지 않은 Member가 1차 캐시에만 영속화된 상태
em.flush();
em.clear();
// --- DB에 TEAM_ID(FK) 설정된 상태
Team findTeam = em.find(Team.class, team.getId());
List<Member> findMembers = findTeam.getMembers();
// team.getMembers().add(member); 을 하지 않아도 조회 가능 (지연 로딩)
for (Member findMember : findMembers) {
System.out.println("findMember = " + findMember.getName());
}
tx.commit();
flush()
, clear()
findTeam.getMembers()
를 하게 되면 해당 List의 size = 0 이다.findTeam.getMembers()
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
em.persist(member);
member.setTeam(team); //** 연관관계의 주인에 값 설정
// team.getMembers().add(member); //** 역방향에 연관관계 설정
// 1. flush와 clear가 없는 경우
// em.flush();
// em.clear();
Team findTeam = em.find(Team.class, team.getId()); // 1차 캐시
List<Member> findMembers = findTeam.getMembers();
for (Member findMember : findMembers) {
System.out.println("findMember = " + findMember.getName()); // size = 0
}
tx.commit();
em.find(Team.class, team.getId())
에서의 값은 SELECT Query를 통해서 가져오는 것이 아니다.class Member {
...
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this); // 나 자신의 instance를 넣는다.
}
}
set~()
형태는 로직이 없이 값을 단순히 설정하는 경우에 사용 (e.g. getter/setter)change~()
로직이 들어가는 경우 (e.g. JPA 상태를 변경하는 경우)class Team {
...
public void addMember(Member member) {
member.setTeam(this); // 나 자신의 instance를 넣는다.
members.add(member);
}
}
// Member의 toString()
@Override
public String toString() {
return "Member{" +
"id=" + id +
", username='" + username + '\'' +
", team=" + team +
'}';
}
// Team의 toString()
@Override
public String toString() {
return "Team{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
System.out.println("members = " + findTeam);
- 연관관계 매핑시 고려사항 3가지
- 다대일 [N:1]
- 일대다 [1:N]
- 일대일 [1:1]
- 다대다 [N:M]
public class Member {
...
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
@ManyToOne
: N에 해당. 연관관계의 주인이다.@JoinColumn
: 외래 키를 매핑할 때 사용한다. name = "TEAM_ID"
: 매핑할 외래 키 이름이다.양방향 관계를 매핑하는 과정
다대일관계의 N쪽에서 연관관계의 주인이 되어서 외래키를 관리하고 있다.
양쪽을 서로 참조하도록 개발한다.
public class Team {
...
@OneToMany(mappedBy = "team") // Member Entity의 team 필드에 의해 매핑되어 짐
private List<Member> members = new ArrayList<>();
...
}
@OneToMany
: 연관관계의 주인이 아니다. (반대쪽의 일대다 단방향 매핑)mappedBy = "team"
: 어디에 매핑이 되었는지에 대한 정보이다. (필수!)@Entity
public class Team {
...
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
...
}
@OneToMany
: 연관관계의 주인이다. (일대다 단방향 매핑)@JoinColumn
: 필수!, 사용하지 않으면 조인 테이블 방식을 사용한다. (중간에 테이블을 하나 자동으로 추가함)
@JoinColumn
이 없으면 TEAM_MEMBER라는 조인 테이블이 하나 생성되고, INSERT 쿼리가 나간다.// Main.java
...
Member member = new Member();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("teamA");
team.getMembers().add(member);
em.persist(team);
tx.commit();
Hibernate:
/* insert hellojpa.Member */
insert
into
Member
(id, age, createdDate, description, lastModifiedDate, roleType, name)
values
(null, ?, ?, ?, ?, ?, ?)
Hibernate:
/* insert hellojpa.Team */
insert
into
Team
(id, name)
values
(null, ?)
/* Member Table에 대한 업데이트 쿼리가 수행되는 것을 확인할 수 있다. */
Hibernate:
/* create one-to-many row hellojpa.Team.members */
update
Member
set
TEAM_ID=?
where
id=?
@Entity
public class Member {
...
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
private Team team;
...
}
@JoinColumn(name = "team_id", insertable = false, updatable = false)
/** Item Class */
@Entity
@Inheritance(strategy = InheritanceType.XXX) // 상속 구현 전략 선택
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
/** Album Class */
@Entity
public class Album extends Item {
private String artist;
}
/** Movie Class */
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
/** Book Class */
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
변수 선언 방식 반복문과 조건문 데이터 타입별 기본적인 메소드들 형변환 및 연산자, 표현식 등
화살표 표기법
function이라는 단어와 중괄호 숫자를 줄이려고 고안된 단축 문법
화살표 함수는 항상 익명이다.
세 가지 단축 문법
예시
화살표 함수는 익명함수를 만들어 다른 곳에 전달하려 할 때 가장 유용하다.
일반적인 함수와 몇가지 중요한 차이점
함수스코프, 실행컨텍스트
스코프: 유효범위(변수)
함수가 정의될 때
변수와 상수, 매개변수가 언제 어디서 정의되는지 결정하는 것을 말한다.
스코프 vs 존재
정적 스코프
전역 스코프
블록 스코프
실행 컨텍스트: 실행되는 코드덩어리(추상적 개념)
메소드
함수처럼 생겼는데 .이 붙은 것
함수와 메소드의 차이점
객체의 프로퍼티인 함수를 메서드라고 불러 일반적인 함수와 구별한다.
예시
콜백함수
something will call this function back(sometime somehow)
제어권을 넘겨준다. 맡긴다.
콜백함수를 어떻게 처리할지는 넘겨받은 대상이 결정한다.
예시 1
예시 2
// 같은 동작을 하도록 직접 구현 Array.prototype.forEach = function(callback, thisArg) { var self = thisArg || this; // thisArg가 없으면 Array의 인스턴스 for(var i = 0; i < this.length; i++) { callback.call(self, this[i], i, this); // this 바인딩의 핵심. value, index, array } // callback에 어떤 데이터를 매개변수로 넘겨줄지 정해져 있다. }
[ [0, 1, 10], [1, 2, 20], [2, 3, 30], [3, 4, 40], [4, 5, 50], ]
예시 3
예시 4 - 이벤트 핸들러
$('#a').on('click', cbFunc); // JQuery
{_vals: Array{3}, logValues: f} 1 2
Window {stop: f, open: f, alert: f, confirm: f, prompt: f, ...} 1 0
this 키워드
일반적으로 this는 객체의 프로퍼티인 함수에서 의미가 있다.
메서드를 호출하면 this는 호출한 메서드를 소유하는 객체가 된다.
예시
o.speak()를 호출하면 this는 o에 묶인다.
this는 함수를 어떻게 선언했느냐가 아니라 어떻게 호출했는냐에 따라 달라진다.
즉, this가 o에 묶인 이유는 speak가 o의 프로퍼티여서가 아니라, o에서 speak를 호출했기 때문이다.
함수를 이렇게 호출하면 자바스크립트는 이 함수가 어디에 속하는지 알 수 없으므로 this는 undefined에 묶인다.
중첩된 함수 안에서 this를 사용하려다보면 혼란스러울 때가 많다.
다른 변수에 this를 할당하여 이런 문제를 해결한다.
또는 화살표 함수를 이용하며 이런 문제를 해결할 수도 있다.
console.log(this);
는 windowconsole.log(this);
는 global내부 함수에서의 우회법
function c() { console.log(self.a); // 20 } c(); } } obj.b();
callback에서
cb.call(this); // 결과: Object i a: 1 b: function(cb)... // 제어권을 넘겨받은 함수나 메서드가 this를 다른 것으로 명시하면, 다른 객체 출력 } }; obj.b(callback);
setTimeout(callback, 100); // 결과: window
setTimeout(callback.bind(obj), 100); // 결과: Object
call, apply, bind
a.call(b, 1, 2, 3);
a.apply(b, [1, 2, 3]);
var c = a.bind(b); c(1, 2, 3);
var d = a.bind(b, 1, 2); d(3);
선언 당시의 환경에 대한 정보를 담은 객체 (구성 환경)
접근 권한 제어
지역변수 보호
데이터 보존 및 활용
지역변수 만들기
자동차 게임
즉, 외부에서 직접 변경할 수 없도록 하자! 스코프 활용
함수 내부에서 다시 함수를 return하면
return된 함수를 그 함수가 최초로 선언될 당시 정보를 유지한다.
그래서 외부에 노출할 데이터만 return하면 return하지 않은 데이터는 모두 외부에서 접근을 제한할 수 있다.
이에 따라 지역변수를 안전하게 보호할 수 있으며
그러면서도 외부에 지역변수의 변경 권한을 넘겨줌으로써 데이터를 활용할 수 있다.
객체지향 프로그래밍, 함수형 프로그래밍의 쿼리에 클로저를 많이 사용하기 때문에 반드시 알아야할 지식이다.
prototype
prototype과 constructor, proto
Constructor -> new -> instance
prototype - -> proto
즉, 생성자 함수의 프로토타입과 instance의 proto라는 프로퍼티는 같은 객체를 참조한다.
proto는 내부 프로퍼티에 접근할 때 생략할 수 있다.
하지만 proto 프로퍼티는 살아있는 것이다.
예시
Array -> new -> [1, 2, 3]
Array.prototype(배열 메서드 모두 포함) - -> [1, 2, 3]
[CONSTRUCTOR]
[CONSTRUCTOR].prototype.constructor
(Object.getPrototypeOf([instance])).constructor
[instance].proto.constructor
[instance].constructor
메소드 상속 및 동작 원리
prototype chaining
Array -> new -> [1, 2, 3]
Array.prototype(배열 메서드 모두 포함) - -> [1, 2, 3]
즉, Array 프로토타입은 객체이다.
또한 proto는 생략이 가능하기 때문에 마치 자신이 호출하는 것처럼 사용 가능
프로토타입은 모두 객체이므로 모든 데이터 타입은 한결같이 이와 동일한 구조를 따른다.
예시
사각지대
Class
prototype static 메서드 및 static 프로퍼티
class 상속 구현
References