MyBatis는 DB저장 프레임워크이다. SQL코드를 작성하고 결과를 객체와 매핑하는 것까지 직접 처리해야 한다. 테이블, DTO 등의 변경사항이 있을때 마다 매핑관련 내용에 대한 수정이 필요하므로 손이 많이간다. JPA(Hibernate)는 ORM을 위한 프레임워크/인터페이스로써 JPA의 구현체가 Hibernate다. SQL코드 없이 DB연동이 가능하며, 설정을 통해 대부분의 작업을 손쉽게 자동화할 수 있지만 기술적 난이도가 높다.
★항상 코딩을 시작하기 전과 push 전에 각각 petch와 pull을 해주어 최신으로 업데이트하는 습관이 필요!!!
commit
git staging에서 Unstaged Changes에서 올리고싶은 걸 +단추를 이용하여 Staged Changes 에 올린 후 Commit Message에 메시지를 남긴 후 Commit and Push 클릭
merge
Git Repositories에서 Remote Tracking에 있는 프로젝트들을 Local에 모두 옮기고, Local check out하면 로컬 프로젝트가 dev/stage/prod 로 바뀐다. 예를들어 Master로 바뀐 상태에서 dev 우클릭 후 Merge를 클릭하면 내 로컬에 dev의 소스가 덮어짐.
pull
톰캣 정지 시키고 pull~
다른 branch에 push하기
다른 branch로 checkout하고 pull로 소스 땡기고, 덮어씌우고싶은 걸 클릭한 뒤 merge 클릭 후 push to origin 클릭!
다른 branch에 소스코드 clone하기
Synchronize with Workspace 클릭 후 전체파일 체크하고 Overwrite.
3. 데이터 삽입 : List Map 에 데이터를 삽입하기 위해서는 Map 형태 데이터를 생성한 후 List에 삽입
4. 데이터 파싱 : List Map 에 담긴 데이터를 for 문을 돌면서 List 데이터를 개별로 출력
List Map 객체 선언
ArrayList <HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
}//ArrayList 넣어줄 계획이고 넣는 타입들은 HashMap이면서 //Hashmap은 key는 String 값 , value 값도 String 값입니다.
List Map 데이터 삽입
HashMap<String, String> map = new HashMap<String,String>();
map.put("1", "아이유");
map.put("2", "수지");
map.put("3", "제니");
//key, value로 String의 값들을 넣어줍니다.
list.add(map);
map = new HashMap<String,String>();
for(int i = 0; i < 5; i++){
map.put(i + "Hello", "Hello "+ i);
//for문을 돌면서 순차적으로 넣어줍니다.
}
list.add(map);
map = new LinkedHashMap<String,String>();
for(int i = 0; i < 5; i++){
map.put(i + "Hello", "Hello "+ i);
//for문을 돌면서 순차적으로 넣어줍니다.
}
list.add(map);
List Map 데이터 출력
public static void print(ArrayList<HashMap<String, String>> list){
//main 부분에서 선언한 list 값을 받아서 출력해보도록 합니다.
for(int i = 0; i < list.size(); i++){
//arraylist 사이즈 만큼 for문을 실행합니다.
System.out.println("list 순서 " + i + "번쨰");
for( Entry<String, String> elem : list.get(i).entrySet() ){
// list 각각 hashmap받아서 출력합니다.
System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
} }}
Set<K> keySet() 은 Key들로 이루어진 Set 자료구조를 리턴한다. Collection<V> values() 은 Value 들로 이루어진 Collection 을 리턴한다.
Map 순회
// 출력
// animal: cat
// food: pizza
map.forEach((k, v) -> {
System.out.println(k + ": " + v);
});
// 한 줄이면 중괄호 { } 생략 가능
map.forEach((k, v) -> System.out.println(k + ": " + v));
// 람다식 안쓰고 for 문으로 구현. forEach 도 내부적으로는 이렇게 구현되어있음
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
forEach 를 사용해서 Map 을 순회할 수 있다. 람다식을 이용하면 좀더 간단하게 나타낼 수 있으며 코드가 한줄이라면 중괄호 { } 를 생략할 수 있다.
Map Compute 데이터 치환
map.compute("animal", (k, v) -> {
System.out.println(k + "'s value is " + v + " -> lion"); // animal's value is cat -> lion
return "lion";
});
// map: {animal=lion, food=pizza}
map.computeIfAbsent("fruit", (k) -> {
System.out.println("New value of " + k + " is apple"); // New value of fruit is apple
return "apple";
});
// map: {fruit=apple, animal=lion, food=pizza}
map.computeIfPresent("animal", (k, v) -> {
System.out.println(k + "'s value is " + v + " -> tiger"); // animal's value is lion -> tiger
return "tiger";
});
// map: {fruit=apple, animal=tiger, food=pizza}
compute 를 사용해 원하는 로직을 실행하고 데이터를 넣을 수 있다.
만약 Key 가 없으면 새로운 데이터를 넣어주고 Key 값이 있으면 데이터를 갱신해준다.
만약 기존에 없는 데이터로 compute 연산을 하게 될 때 value 값은 null 이 된다.
computeIfAbsent 와 computeIfPresent 는 조건을 걸어서 compute 연산을 실행한다.
computeIfAbsent 는 Key 가 없을 때만 실행되기 때문에 람다식으로도 key 값 하나 밖에 받지 않는다.
HashMap 은 hashcode 를 사용하기 때문에 순서가 일정하지 않다. LinkedHashMap 은 내부를 Double-Linked List 로 구성하여 HashMap 의 순서를 유지한다. HashMap 에서 상속받기 때문에 HashMap 의 모든 메소드를 사용할 수 있다.
데이터는 먼저 들어간 데이터가 무조건 앞에 위치하게 된다. forEach 문에서도 동일하다.
추가 소스
package exam;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class exam3 {
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("key01", "value01");
map.put("key02", "value02");
map.put("key03", "value03");
map.put("key04", "value04");
map.put("key05", "value05");
//entrySet() 메서드는 key와 value의 값 모두 출력
//keySet() 메서드는 key의 값만 출력
//Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법
// 방법 01 : entrySet()
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("방법1: [key]:" + entry.getKey() + ", [value]:" + entry.getValue());
}
System.out.println("----------------------------------------------------------------------------------");
// 방법 02 : keySet()
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println("방법2: [key]:" + key + ", [value]:" + value);
}
System.out.println("----------------------------------------------------------------------------------");
// 방법 03 : entrySet().iterator()
Iterator<Map.Entry<String, String>> iteratorE = map.entrySet().iterator();
while (iteratorE.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) iteratorE.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("방법3: [key]:" + key + ", [value]:" + value);
}
System.out.println("----------------------------------------------------------------------------------");
// 방법 04 : keySet().iterator()
Iterator<String> iteratorK = map.keySet().iterator();
while (iteratorK.hasNext()) {
String key = iteratorK.next();
String value = map.get(key);
System.out.println("방법4: [key]:" + key + ", [value]:" + value);
}
System.out.println("----------------------------------------------------------------------------------");
// 방법 05 : Lambda 사용
map.entrySet().stream().forEach(entry-> {
System.out.println("방법5: [key]:" + entry.getKey() + ", [value]:"+entry.getValue());
});
System.out.println("----------------------------------------------------------------------------------");
// 방법 06 : Stream 사용
map.entrySet().stream().forEach(entry-> {
System.out.println("방법6-1: [key]:" + entry.getKey() + ", [value]:"+entry.getValue());
});
System.out.println("----------------------------------------------------------------------------------");
// Stream 사용 - 내림차순
map.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry-> {
System.out.println("방법6-2: [key]:" + entry.getKey() + ", [value]:"+entry.getValue());
});
System.out.println("----------------------------------------------------------------------------------");
// Stream 사용 - 오름차순
map.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())).forEach(entry-> {
System.out.println("방법6-3: [key]:" + entry.getKey() + ", [value]:"+entry.getValue());
});
}
}