변환 에러를 피하기 위해 게시물 번호를 Integer를 썼다. 사용자가 요청한 데이터를 DTO에 담아서 서비스 계층으로 서비스 계층에서 Repository 계층으로 데이터를 전달할 필요가 있다 각 계층으로 분리를 해놨기 때문에 계층 간 데이터를 전달하는 객체가 DTO 컨트롤러의 실행 흐름 제어 : Redirect & Forward 관심사, 역할에 따라 계층을 분리해놨고 각 계층 간 데이터를 전달할 필요가 있기 때문에 그 데이터를 담을 객체를 DTO라고 한다. xml문 작성하기 1.mapper > boardMapper.xml 파일 생성하기 2.xml 코드 따오기 3.select문 만들기 4.console로 가서, board 테이블을 검색하는 select sql문을 만들어서 복사해서 가져와서 붙여넣어주기 s..
컨트롤러에서 DB를 직접 관여하지 않고, UserDAO (Repository)를 통해 DB를 조작하였다. @Controller - Presentation Layer @Repository - Persistence Layer(영속계층), Data access Layer 컨트롤러는 DB 조작 없이 본연의 역할에 집중하도록 관심사를 분리한 것이다. 사용자의 이력을 다루게 되었다 컨트롤러에서 Dao를 주입한다 회원가입 할 때 사용자의 이력까지 다루는 것은 비즈니스 로직이다. (컨트롤러 내, DAO 내에도 위치하면 X) 비즈니스 로직을 담당할 객체를 하나 더 만들어야 한다. 비즈니스로직의 메소드명은 업무 용어와 같다. (UserDao의 메소드는 SQL적) 트랜잭션을 비즈니스 계층에 적용한다 회원 가입, 유저 이력까..
before & after코드 추가 -> 공통 코드 중복 만약 변경 사항이 생기면 똑같은 곳을 여러번 고쳐야한다. 조금 더 현명한 방법으로 해결하려고 한다 그것이 AOP 코드들을 따로 분리해냈다 하나의 메서드에 핵심기능/부가기능으로 두 개의 관심사가 있다. 서로 다른 관심사가 하나의 메서드에 있다면 관심사를 분리해줘야한다. 분리해야 하는 것 : 1. 관심사 / 2. 변하는 것/변하지 않는 것 / 3. 중복 코드 메서드 호출 부분 -> reflection API를 호출해서 메소드를 호출할 수 있도록 한다. 실습 package com.fastcampus.ch3.aop; import java.lang.reflect.Method; public class AopMain { public static void mai..
insert, update, select 등 명령 하나 하나가 Tx이다. 계좌 이체(update)는 출금 따로 입금 따로 작업을 할 수 없기 때문에 같이 묶어야 한다. 둘 다 성공하던가 / 하나만 실패해도 취소 -> All or Nothing 둘 이상의 작업을 어떻게 트랜잭션으로 묶을까? 우선 속성부터 배워보자 원자성 일관성 - 계좌 이체 전 과 후의 총 금액이 같아야한다. 고립성 - 서로의 작업(Tx1, Tx2)이 영향을 주면 안된다. (작업에 따라 Isolation Level을 적절하게 선택) 영속성 커밋을 해버리면, 롤백이 불가하다 자동 커밋 - 명령을 실행할 때마다 바로 커밋을 해버림 -> 롤백 불가 수동 커밋 - 내가 직접 커밋 명령을 내려줘야 커밋이 되는 것 각 트랜잭션을 고립시키는 정도를 나..
컨트롤러가 직접 DB에 접근하게 되면, 메소드가 중복된다. 중복을 제거하려면? 공통 부분을 따로 분리해낸다. 계층의 분리! UserDao를 통해 DB에 접근한다면 중복코드가 제거된다. 이 UserDao를 영속 계층(Persistence Layer), Data Access Layer 라고 하고, 컨트롤러 부분은 Presentation Layer라고 한다. 데이터를 보여주는 계층이다. 이렇게 분리해내는 이유는 1.관심사의 분리 / 2. 변하는 것과 변하지 않는 것 / 3. 중복, 공통 코드 1,3번이다. 나중에 MySQL을 쓰던지 Oracle을 쓰던지, 인터페이스를 사용하면 UserDao가 바뀌어도 상관없다. UserDao.java를 만들고, UserDaoImpl을 만들었다. UserDao를 인터페이스로 만..
스프링으로 DB를 다루기위해, TDD코드에 테이블에 회원 정보를 추가하는 메소드를 만들고 매개변수로 User를 주었기 때문에 User클래스를 만들어준다(테이블의 컬럼과 똑같이 만들어준다) 그리고나서 insertUser메소드를 만들어준 뒤 Test코드로 insertUserTest()코드를 만들어준다. public class DBConnectionTest2Test { @Autowired DataSource ds; @Test public void insertUserTest() throws Exception{ User user = new User("kim","1234","abc","aaa@aaa.com",new Date(),"fb",new Date()); int rowCnt=insertUser(user); as..
package com.fastcampus.ch3; import java.sql.*; public class DBConnectionTest { public static void main(String[] args) throws Exception { // 스키마의 이름(springbasic)이 다른 경우 알맞게 변경해야 함 String DB_URL = "jdbc:mysql://localhost:3306/springbasic?useUnicode=true&characterEncoding=utf8"; // DB의 userid와 pwd를 알맞게 변경해야 함 String DB_USER = "hyerin"; String DB_PASSWORD = "hyerin"; Connection conn = DriverManager...