Spring/스프링의 정석


1. JSON 이란? - Java Script Object Notation : 자바 스크립트 객체 표기 - XML은 너무 복잡함, JSON으로 데이터 교환 - {속성명1:속성값1, 속성명2:속성값2,...} 이런 형식 - [{속성명:속성값,...}, {속성명:속성값,...}, ...] : 객체 배열 - {키1:{속성명:속성값,...}, 키2:{속성명:속성값,...}, ...} : Map 2. stringify()와 parse() - JS객체를 서버로 전송하려면, 직렬화(문자열로 변환)가 필요함 - 서버가 보낸 데이터(JSON 문자열)를 JS 객체로 변환할 때, 역직렬화가 필요 - JSON.stringify() : 객체를 JSON 문자열로 변환 - JSON.parse() : JSON 문자열을 객체로 변환 ..


1. MyBatis MyBatis란? - SQL Mapping Framework로 자바코드와 SQL을 맵핑해준다. (XML을 별도 SQL로 분리 ) - 자바 코드로부터 SQL 문을 분리해서 관리 - 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거 - 작성할 코드를 줄어서 생산성 향상 & 유지 보수 편리 - SqlSessionFactory : SqlSession을 생성해서 제공 (인터페이스) - SqlSession : SQL 명령을 수행하는데 필요한 메서드를 제공 (인터페이스) - SqlSessionFacotryBean : SqlSessionFactory를 Spring에서 사용하기 위한 빈 (위 인터페이스 구현) - SqlSessionTemplate : SQL명을 수행하는데 필요한 메서드를 제공 thre..


1. 서비스 계층의 분리와 @Transactional - 비즈니스 로직의 분리 - RegisterController는 UserService만 주입받아서 쓰면 되고 UserService가 UserDao와 UserHistoryDao를 주입 받는다. - RegisterController는 PRESENTATION 부분으로 @Controller 사용한다. - UserService는 서비스 계층(Business Lobic)부분으로 @Service 사용한다. (여기서 Tx 처리) - UserDao와 UserHistoryDao는 영속 계층(PERSISTENCE)부분으로 @Repository 사용한다. - 이렇게 3가지의 계층으로 나누는 것이 보통이다. (Controller는 내용안바뀜) [참고] - @Controlle..


1. Transaction, Commit, Rollback - 더이상 나눌 수 없는 작업의 단위(Tx) - insert, update, select등이 다 transaction임 - 계좌 이체의 경우, 출금과 입금이 하나의 Tx로 묶여야 됨 (all or nothing) 1. 원자성(Atomicity) : 나눌 수 없는 하나의 작업으로 다뤄져야 한다. 2. 일관성(Consistency) : Tx 수행 전과 후가 일관된 상태를 유지해야 한다. 3. 고립성(Isolation) : 각 Tx는 독립적으로 수행되어야 한다. (isolation level에 따라 다른 Tx 영향 줄수도) 4. 영속성(Durability) : 성공한 Tx의 결과는 유지되어야 한다. - Commit : 작업 내용을 DB에 영구적으로 저..


1. DB 연결하기 Maven repository에서 MySQL connector maven 복사해서 pom.xml에 붙혀넣기 // 스키마의 이름(springbasic)이 다른 경우 알맞게 변경 String DB_URL = "jdbc:mysql://localhost:3306/springbasic?useUnicode=true&characterEncoding=utf8"; // DB의 userid와 pwd를 알맞게 변경 String DB_USER = "root"; String DB_PASSWORD = "1234"; String DB_DRIVER = "com.mysql.jdbc.Driver"; DriverManagerDataSource ds = new DriverManagerDataSource(); ds.set..


1. Spring DI - 실습 - main/resource에 생성 class Car{ String color; int oil; Engine engine; Door[] doors;} class Engine{} class Door{} public class SpringDiTest { public static void main(String[] args){ ApplicationContext ac = new GenericXmlApplicationContext("config.xml"); Car car = (Car) ac.getBean("car"); // byName //Car car = ac.getBean("car",Car.class); 위랑 같은 문장 Car car2 = (Car) ac.getBean(Car.c..


1. Spring DI 흉내내기 - 다형성, factory method 으로 변경에 유리한 코드짜기 - getObject를 사용하여 변경을 할때 코드에는 손을 대지않고 config.txt만 바꿔서 객체 생성이 가능 car=com.fastcampus.ch3.diCopy1.Truck engine=com.fastcampus.ch3.diCopy1.Engine class Car {} class SportsCar extends Car{} class Truck extends Car{} class Engine{} public class Main1 { public static void main(String[] args) throws Exception{ Car car = getCar(); Car car2 = (Car)ge..


1. DispatcherServlet 파헤치기 - 기본적으로 입력,처리,출력 서블릿이 여러개 존재한다 - 공통 처리 부분을 DispatcherServlet을 통해 제거한다. 즉 DispatcherServlet이 전처리를 해준다. 1. 요청이 들어오면 DispatcherServlet은 HandlerMapping한테 해당 URL에 대한 Handler Method 정보를 받아옴 (HandlerAdapter를 통해 DispatcherServlet와 Controller을 느슨한 연결을 함) 2. HandlerMapping을 통해 받아온 정보로 누가 이것을 처리할 수 있는지 모든 HandlerAdapter에 대해 물어봄 그리고 HandlerAdapter를 통해 어떤 Controller로 호출할지 알게 되는 것임. ..

1. 예외처리 실습 @RequestMapping("/ex") public String main() throws Exception{ try { throw new Exception("예외가 발생했습니다."); } catch (Exception e) { // TODO Auto-generated catch block return "error"; } } @RequestMapping("/ex2") public String main2() throws Exception{ try { throw new Exception("예외가 발생했습니다."); } catch (Exception e) { // TODO Auto-generated catch block return "error"; } } - try-catch 문 쓰면 중복..