자바 웹 개발 시작하기 (6주차 : 커뮤니티를...
DESCRIPTION
Java web development 06 자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!) 2011. 12. 02 벌써 2년도 넘은 자료지만 그래도 필요하신분이 있을지 몰라서... (지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)TRANSCRIPT
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
2011. 12. 02
DEVELOPMENT #2
이덕곤
§ 다시 보는 스프링 프레임워크 § 단순함에서 발견하는 아름다움
§ IoC (Inversion of Control)
§ DI (Dependency Injection)
§ AOP (Aspect Oriented Programming)
§ 중간 정리를 하는 시간… (프로젝트 범위의 설정)
§ 간단한 게시판을 커뮤니티를 만들어보자!
§ DataBase : MySQL, JDBC, DBCP
§ 하이버네이트, 기초 쿼리(CRUD)
§ Transaction(TX)
§ 쿠키와 세션
§ 커뮤니티 프로젝트의 시작
§ DB (DataBase) § 하나 이상의 자료를 저장하고 효율적으로 관리하기
위한 데이터 집합
§ 공유의 목적으로, 체계적으로 정리된 정보를 효율적 으로 관리하고 검색할 수 있는 정보의 집합
§ DBMS (DataBase Management System)
§ 데이터베이스를 구성하고 운영하기 위해 구성된 소프트웨어 시스템으로 오라클, MySQL등 일반적으로 알고 있는 데이터베이스제품이 DBMS다
회원 테이블
관계형 데이터베이스
레코드(행)
필드(열)
§ 관계형 데이터베이스(Relational Database, RDB) § 데이터를 표와 같이 행과 열의 관계로 표현하는 데이터베이스
§ SQL(Structured Query Language) § 데이터베이스에 접근하여 데이터를 삽입, 수정, 삭제하기 위한
데이터베이스 질의 언어
아이디 비밀번호 이름 생년월일
onlyjiny 1111 이명진 1976.8.2
grace1105 2222 변은혜 1976.11.5
jabook 3333 자북 1998.3.4
DDL (Data Definition Language) : 데이터와 그 구조를 정의 합니다.
SQL문 내 용
CREATE 데이터베이스 객체를 생성 합니다.
DROP 데이터베이스 객체를 삭제 합니다.
ALTER 기존에 존재하는 데이터베이스 객체를 다시 정의하는 역할을 합니다.
DML (Data Manipulation Language) : 데이터의 검색과 수정등의 처리
SQL문 내 용
INSERT 데이터베이스 객체에 데이터를 입력
DELETE 데이터베이스 객체에 데이터를 삭제
UPDATE 기존에 존재하는 데이터베이스 객체안의 데이터 수정
SELECT 데이터베이스 객체로부터 데이터를 검색
DCL (Data Control Language) : 데이터베이스 사용자의 권한을 제어
SQL문 내 용
GRANT 데이터베이스 객체에 권한을 부여 합니다.
REVOKE 이미 부여된 데이터베이스객체의 권한을 취소합니다.
§ CRUD라고도 함
§ 입력 § INSERT INTO 테이블명(필드명, 필드명) VALUES(값, 값);
§ 수정 § UPDATE 테이블명 SET 필드명=값, 필드명=값 WHERE 조건;
§ 삭제 § DELETE FROM 테이블명 WHERE 조건;
§ 선택
§ SELECT 보여질 필드명 FROM 테이블명 WHERE 조건;
§ Open Source managed by Jboss Group
§ 객체를 RDB에 매핑해서 저장하는 ORM(Object-Relational Mapping) Tool
§ 객체 모델링과 그에 따른 모델 과 Relational Data Model 사이에는 개념적 불일치가 존재 => ORM 자동화 도구들의 등장
§ hibernate은 가장 강력하고 lightWeight하며 조작이 간편하다
§ DB 변경 시 어플리케이션 소스는 전혀 수정하지 않음
§ 성공사례: AT&T, PriceWaterhouseCoopers
Transient Objects Business Layer
Session Factory
Transaction Factory
Connection Provider
Session Transaction
Persistence Layer
Persistence Objects
JNDI JDBC JTA
Hibernate API J2EE API
§ this.hibernateTemplate.save(board);
§ this.hibernateTemplate.update(board);
§ this.hibernateTemplate.delete(board);
§ Board board = (Board) this.hibernateTemplate.execute(new HibernateCallback<Object>(){
public Object doInHibernate(Session session) { Criteria criteria = session.createCriteria(Board.class); criteria.add(Restrictions.eq("boardIdx", boardIdx)); return criteria.uniqueResult(); }
});
§ criteria.addOrder(Order.asc("postIdx"));
§ criteria.setMaxResults(1);
§ return criteria.uniqueResult();
§ Criterion subject = Restrictions.like("subject", "%" + 검색어 + "%");
§ Criterion summary = Restrictions.like("summary", "%" + 검색어 + "%");
§ LogicalExpression orExp = Restrictions.or(subject, summary);
§ criteria.add(orExp);
§ criteria.add(Restrictions.ge("regDate", startDate));
§ criteria.add(Restrictions.le("regDate", endDate));
§ JDBC(Java Database Connectivity) § 자바를 이용해 데이터베이스 프로그래밍을 하기 위한 표준 인터페이스
§ 자바 프로그램에서 데이터베이스 질의(SQL)를 실행하기 위한 자바 API
§ 데이터베이스 및 애플리케이션 개발자들을 위한 표준 API를 제공
자바 프로그램 JDBC Interface
Oracle
Microsoft SQL
MySQL
Oracle용 JDBC 드라이버
MS-SQL용 JDBC 드라이버
MySQL용 JDBC 드라이버
PoolingTest JSP
Connection Pool Class
Connection Pool
Connection
Connection
Connection
ConnectionFactory Class
Database
Connection
Connection
Connection 생성 및 보관 1
Connection 요청 2
Connection 제공 3
Connection 사용 4
Connection 반납 5 Connection Connection
§ Pooling 기법 § 미리 여러 개의 데이터베이스 Connection을 생성해서 보관
§ Connection이 필요할 때마다 Connection Pool로부터 하나씩 꺼내서 사용하고 사용이 끝나면 다시 Connection을 보관
§ Connection Pool이 데이터베이스의 연결과 해제를 직접 관리
§ 트랜잭션(Transaction) : 일련의 연산 집합으로 논리적 기능을 수행하기 위한 작업의 단위 § 동시성제어 모듈 : 데이터베이스를 일관성 있게 유지하기 위하여 동시에
수행되는 트랜젝션들 사이의 상호작용을 제어
§ 회복제어 모듈 : 데이터베이스를 일관성 있게 유지하기 위하여 업데이트를 하는 동안 시스템 장애에도 데이터베이스의 기존 상태가 유지
§ ACID 규칙
§ 원자성(atomicity) : 자기 연산을 전부 또는 전무 실행만 한다
§ 일관성(consistency) : 트랜잭션 실행 후 일관성 있는 상태로 변환
§ 격리성(isolation) : 트랜잭션 실행 중 연산의 중간 결과에 다른 트랜잭션이 접근할 수 없다
§ 영속성(durability) : 실행이 성공적으로 완료되면 그 결과는 영속적이다.
§ 라이브러리 추가 § org.springframework.transaction-3.0.6.RELEASE.jar
§ applicationContext.xml 수정 § xmlns:tx="http://www.springframework.org/schema/tx"
§ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
§ <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
§ <property name="sessionFactory">
§ <ref bean="sessionFactory" /></property></bean>
§ <tx:annotation-driven transaction-manager="transactionManager" />
§ 역시 POJO기반
§ 저장할 정보 § 사용자 번호 : int, 자동 증가
§ 아이디 : String, 20자
§ 비밀번호 : String, 20자
§ 이름 : String, 20자
§ 별명 : String, 20자
§ 전자우편 : String, 50자
§ 테이블명 : ID_user
@Entity
@Table(name = "byuri_user") // 저장하는사람 ID
public class User
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = “user_idx")
private int userIdx; // PK, 자동생성
@Column(length = 16, unique = true)
private String userId;
public int getUserIdx() {
return userIdx;
}
public void setUserIdx(int userIdx) {
this.userIdx = userIdx;
}
}
§ @Service
§ @Transactional
§ 가입을 합니다
§ 가입 축하 글을 작성합니다
§ 중간에 에러가 발생 할 경우
§ 가입을 취소 합니다
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserDao userDao;
@Autowired
private BoardDao boardDao;
@Override
@Transactional
public int joinUser(User user)
{
……
}
}
§ HTTP는 상태를 기억하지 않는다
구분 쿠키(Cookie) 세션(Session) 저장 위치 클라이언트(Client) 서버(Server)
저장 형식 텍스트 형식 Object 형식
종료 시점
쿠키 저장 시 설정 (설정하지 않으면 브라우저 종료 시 소멸)
정확한 시점을 알 수 없음
자 원 클라이언트의 자원을 사용 서버의 자원을 사용
용량 제한
한 도메인 당 20개, 쿠키 하나 당 4KB, 총 300개
서버가 허용하는 한 용량에 제한이 없음
§ 서로 다른 호스트간, 즉 클라이언트와 서버간에 네트워크 연결이 지속적으로 유지되고 있는 상태 § HTTP 프로토콜의 특성상 연결이 지속적인 유지 불가
§ 한 클라이언트가 서버의 사이트를 방문하면 JSP 엔진은 유일한 ID를 부여(session ID라 부름)
§ Session ID 이용 방법 § 각각의 클라이언트에게 유일한 sessionID를 부여하여 서로 다른 서버 접
근 권한을 부여
§ Session 객체마다 저장해 둔 데이터를 이용하여 서로 다른 클라이언트의 요구에 맞는 서비스 제공 가능
§ 클라이언트 자신만의 고유한 페이지를 열어 놓아서 생길 수 있는 보안상의 문제 해결 가능
§ User userSession = userDao.getUser(userIdx);
§ HttpSession session = request.getSession();
§ session.setAttribute("userSession", userSession);
메소드 반환값 설 명
getAttribute(name) Object 세션에 저장되어 있는 속성 값중 name에 해당하는 Object 객체형으로 반환
getAttributeName() String 배열 세션 객체에 값을 저장하고 있는 각각의 속성의 이름 모두를 배열로 반환
getCreationTime() long 세션이 형성될 때 시간을 ’70년 1월 1일 자정기준으로 계산된 1/1000초 단위 값으로 반환
getID() String 클라이언트에 할당된 sessionID값의 최근 접속시간을 long 형으로 반환
getLastAcessedTime() long 세션동안 클라이언트가 마지막으로 서버에 보낸 요청시간을 반환
getMaxInactiveInterval()
int 사용자가 세션을 부여받은 후 아무것도 하지 않을 깨 자동으로 세션을 종료하도록 설정된 시간 값
incadidate() void 현재 실행중인 세션을 무효화 시킴
inNew() boolean 현재 실행중인 세션이 새로운 것인지 여부를 논리값으로 반환
setAttribute() void 현재 세션이 새로운 이름의 속성을 만들고 그 속성에 값을 할당
removeAttribute() void 현재 세션에 저장되어 있는 속성값들 중 지정한 속성 값을 지움
setMaxInactiveInterval() void 세션을 할당받고 아무런 요청이 없을 때부터 세션을 유지하는 기간 지정
§ 데이터베이스에 대해 알아보았습니다
§ JDBC에 대해 알아보았습니다
§ DBCP에 대해 이해하였습니다.
§ 하이버네이트, 기초 쿼리(CRUD)를 이해 합니다
§ 서비스를 만들어 보았습니다
§ Transaction(TX)을 이해하고 구현해 보았습니다
§ 쿠키와 세션을 이해하고 세션을 사용해 봅니다
§ 테스트와 국제화
§ jUnit : 단위 테스트 전략 알아보기
§ 글쓰기 테스트
§ 국제화
§ Validation
§ 예외처리
§ 과제 : 국제화된 커뮤니티로 만들어 오기
§ http://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4
§ http://ko.wikipedia.org/wiki/SQL
§ http://en.wikipedia.org/wiki/SQL
§ http://www.hibernate.org/
§ http://toby.epril.com/?p=468
§ http://antop.tistory.com/25
§ http://creatorw.tistory.com/42
§ http://www.javajigi.net/pages/viewpage.action?pageId=5415
§ http://wiki.javajigi.net/pages/viewpage.action?pageId=297 § http://w.nya.kr/doku.php?id=%EC%88%98%EC%97%85:%EC%9B%B9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9
E%98%EB%B0%8D_%EC%84%A4%EA%B3%84:%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80%EC%9D%98_%EB%8C%80%ED%99%94_%EC%BF%A0%ED%82%A4%EC%99%80_%EC%84%B8%EC%85%98