2013년 9월 30일 월요일

[10주차 2일] XML

-well-formed XML

-DTD(Document Type Definition)
: 유효한 문서(Validate Document)

외부DTD
내부DTD


-XML 스키마
: DTD보다 정밀도를 높게 정의 할수 있는 것

[10주차 2일] RESTful

HTTP 프로토콜에 맞춰서
데이터를 주고 받는 것
리턴형식은 JSON, XML

[10주차 2일] Web Service

[10주차 2일] RMI, RCP

RMI
: stub관 skeleton 자동으로 생성

-stub

-skeleton

[10주차 2일] HTML & XML

[10주차 1일] Session 애노테이션으로 얻어오기

@SessionAttribute("객체명") 으로 해당 객체를 세션에서 받아올 것을 선언


이렇게 세션객체를 가져올 때는
sessoin.invalidate() 가 동작하지 않는다.

그러므로

SessionStatus status를 인자값으로 설정한후
status.setComplete()  메서드를 호출해서
세션을 종료시킬수 있다.

2013년 9월 29일 일요일

[10주차 1일] View Resolver

[10주차 1일] WEB-INF

WEB-INF 는 소스 및 설정이 들어가는 폴더이기 때문에

외부에서 접근을 할수 없다.

그러므로 jsp등의 View를 노출 시지 않으려면 WEB-INF아래에 놓으면 된다.

[참고] 윈도우 실행 명령어 블로그

http://blog.naver.com/ees4man?Redirect=Log&logNo=30111980408

[10주차 1일] @Transcational 애노테이션으로 Transaction 처리

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/html/transaction.html#transaction-declarative

[10주차 1일] @Controller, @Service, @Repository 붙이기

[10주차 1일] Layer간의 interface를 두는 이유

- Presentation

- Business

- Persistance

2013년 9월 26일 목요일

[9주차 5일] Spring 사용시 Controller의 Return Type

- ModelAndView

- Model

- Map

-String

- void


[9주차 5일] Spring을 이용할 파일 전달

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/html/mvc.html#mvc-multipart-forms-non-browsers

[9주차 5일] Spring사용시 용해서 Controller에서 Jsp로 값 전달

-Map

-Model

-ModelMap

[9주차 5일] Spring사용할때 Controller사용 및 Method에서 파라미터 받아오기

[9주차 4일][ Spring에서 Transaction처리하기

[9주차 4일] DispatcherServlet

[9주차 4일] ContextLoaderListener

2013년 9월 25일 수요일

[9주차 4일] Maven

http://dimdim.tistory.com/entry/Maven-%EC%A0%95%EB%A6%AC

[9주차 4일] Sprint Web MVC framework

[참고] egit 사용방법 참고 블로그

http://blog.naver.com/platinasnow?Redirect=Log&logNo=30166249802

[9주차 4일] Tramsaction 관리 정책

Rrequired
: 트랜젝션 필요
없다면? 새로생성
있다면? 기존트랜젝션 사용

RrequiresNew
: 트랜젝션 필요
없다면? 새로생성
있다면? 새로생성

[9주차 4일] Transaction 관리

1. programmetic
: 비지니스 로직변경시 코드 변경

2. 선언적방법
: 별도 외부 파일에 트랜젝션 관리 방법을 설정
  Bean Container가 관리





// 1. Transaction 처리 정책 정의
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("tx1");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

// 2. Transaction 정책을 적용한 작업자 얻기
TransactionStatus txStatus = txManager.getTransaction(def);





2013년 9월 23일 월요일

[9주차 2일] Spring Framwork

- AOP(Aspect Oriented Programming)
: 메서드 앞뒤로 필터를 끼워서 쓸수 있도록 하는 프로그래밍

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Bean 컨테이너에서 관리할 객체를 선언한다.
. Bean 컨테이너가 객체를 생성하여 보관한다.
. 해당 객체의 setter 메서드를 호출하여 의존 객체를 넣어준다.
-->

<!-- Student 객체 생성  ==> 's1'이라는 키로 저장하라. -->
<bean id="s1" class="net.bitacademy.java41.test.t01.Student"></bean>

<!-- 기본 생성자를 이용해서 객체 생성 ==> setter 호출하는 방법 -->
<bean id="s2" class="net.bitacademy.java41.test.t01.Student">
<property name="name" value="홍길동"></property>
<property name="age">
<value>50</value>
</property>
<property name="tel" value="1111-2222"/>
</bean>

<!-- 호출할 생성자를 지정하는 방법 -->
<bean id="s3" class="net.bitacademy.java41.test.t01.Student">
<constructor-arg value="임꺽정"/>
<property name="age" value="30"/>
<property name="tel" value="1111-2222"/>
</bean>

<!-- 객체를 요구할 때 마다 생성하게 하는 방법
. scope: singleton(default), prototype(매번생성), session, request
-->
<bean id="s4" class="net.bitacademy.java41.test.t01.Student" scope="prototype">
<constructor-arg value="임꺽정"/>
<property name="age" value="30"/>
<property name="tel" value="1111-2222"/>
</bean>

<!-- bean 태그의 속성을 이용하여 setter 메서드 호출하기
1) 기존의 속성과 프로퍼티를 호출하는 속서을 구분하기 위한 태그 네임스페이스 지정.
네임스페이스란? 태그들을 모아 놓은 패키지를 말함.
xmlns="http://www.springframework.org/schema/beans/p"

2) 'p'라는 접두사를 사용하여 프로퍼티 이름을 지정하면 된다.
p:name="홍길동"
-->
<bean id="s5" class="net.bitacademy.java41.test.t01.Student"
p:name="일지매" p:age="60" p:tel="3434-3434"/>

</beans>





package net.bitacademy.java41.test.t01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Spring01 {

public static void main(String[] args) {
ApplicationContext  ctx = new ClassPathXmlApplicationContext("net/bitacademy/java41/test/t01/application-context.xml");
Student s =  (Student) ctx.getBean("s5");

System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getTel());
}

public static void main04(String[] args) {
ApplicationContext  ctx = new ClassPathXmlApplicationContext("net/bitacademy/java41/test/t01/application-context.xml");
Student s =  (Student) ctx.getBean("s4");

// 기본적으로 객체는 싱글톤 방식으로 관리한다.
Student s2 = (Student) ctx.getBean("s4");
s2.setName("임꺽정2");
s2.setAge(50);
s2.setTel("5555-6666");

System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getTel());

System.out.println("---------------");
System.out.println(s2.getName());
System.out.println(s2.getAge());
System.out.println(s2.getTel());

if (s == s2) {
System.out.println("s == s2 같은객체");
} else {
System.out.println("s != s2 다른객체");
}
}

public static void main03(String[] args) {
ApplicationContext  ctx = new ClassPathXmlApplicationContext("net/bitacademy/java41/test/t01/application-context.xml");
Student s =  (Student) ctx.getBean("s3");
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getTel());

// 기본적으로 객체는 싱글톤 방식으로 관리한다.
Student s2 = (Student) ctx.getBean("s3");
if (s == s2) {
System.out.println("s == s2 같은객체");
}
}

public static void main02(String[] args) {
ApplicationContext  ctx = new ClassPathXmlApplicationContext("net/bitacademy/java41/test/t01/application-context.xml");
Student s =  (Student) ctx.getBean("s2");
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getTel());
}

public static void main01(String[] args) {
ApplicationContext  ctx = new ClassPathXmlApplicationContext("net/bitacademy/java41/test/t01/application-context.xml");
Student s =  (Student) ctx.getBean("s1");
if (s != null) {
System.out.println("정말 자동 생성된다.");
} else {
System.out.println("엥.....");
}
}


}




[9주차 2일] Bean Container

[9주차 2일] myBatis Dynamic SQL

[9주차 2일] log4j

2013년 9월 17일 화요일

[Android] 화면 크기 가져오기

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

[Android] 이미지 사이즈 초과시 Resize 방법

이미지를 넣고 실행을 시켰는데 로그캣에 아래와 같은 메시지가 나오면서
이미지가 나오지 않는 현상이 발생했다.

Bitmap too large to be uploaded into a texture (2316x4632, max=4096x4096)

그래서 찾아보니
허니콤 버전부터 하드웨어 가속을 이용할수 있어서
2D를 랜더링 할때도 openGL을 이용할수 있게 되어서 이미지를 텍스쳐 형태로 전달하게 되는데,
이때 이미지 싸이즈가 4096x4096 이상되면 텍스쳐로 처리가 안되기 때문이라고 한다.

그래서 BitmapFactory 에서 SampleSize옵션으로 주어서 Bitmap을 작게 축소해서 불러오면 된다고 한다.


아래의 코드는 4픽셀을 1픽셀로 쳐서 가져오겠다는 것이다.
즉, 1/4크기로 줄여서 가져오는 것이다.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap src = BitmapFactory.decodeFile( "/sdcard/image.jpg", options );
Bitmap resized = Bitmap.createScaledBitmap( src, dstWidth, dstHeight, true ); 





아래의 블로그를 참고해보자.
http://aroundck.tistory.com/59

2013년 9월 16일 월요일

[8주차 2일] 웹에서 파일 업로드

<form  enctype="mutipart/form" >

 enctype="mutipart/form" 속성 추가

파트로 나눠서 보낸다
파트로 나눠서 보낸것을 받을때
byte배열로 들어온 것을 잘라야 하는데,

apache commons 의 fileupload를 받아서 자르도록 하자 이때 io도 필요하니 같이 받자
http://commons.apache.org/proper/commons-fileupload/
http://commons.apache.org/proper/commons-io/

값을 꺼낼때 한글 처리는
request.setCharacterEncoding("UTF-8");
이 적용이 안되기 때문에 각각 값을 받을 때 한글처리를 해줘야 한다.
item.getString("UTF-8");

2013년 9월 15일 일요일

[8주차 1일] Reflections Api

https://code.google.com/p/reflections/

download > jar파일 다운로드 한다.

[참고] Enumeration vs. Iterator 참고 블로그

http://blog.naver.com/PostView.nhn?blogId=o_ov_v0_0&logNo=40107896604

http://stackoverflow.com/questions/948194/difference-between-java-enumeration-and-iterator

[참고] HashMap, HashSet, HashTable 차이

http://darksilber.tistory.com/70

[8주차 1일] Annotation

 * Annotation
 * - 컴파일러에게 제공하는 특별한 정보
 * - 컴파일이나 배포하는 동안 사용할 특별한 정보
 * - 실행하는 동안 사용할 특별한 정보
 * - 문법
 * @애노테이션이름(속성=값,속성=값, ...)
 * - 만약 속성 이름이 다음과 같이 'value'일 경우 생략가능
 * @애노테이션이름(value="okok")
 * ==> @애노테이션이름("okok")
 * - 그러나, 속성이 2개 이상일 경우는 value  이름을 생략할 수 없다.
 * @애노테이션이름("okok", age="20") // 오류!
 * ==> @애노테이션이름(value="okok",age="20") //OK


애노테이션 정의는 인터페이스 정의하는것과 유사하다.


package net.bitacademy.java41.test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/*
 * Annotation
 * - 컴파일러에게 제공하는 특별한 정보
 * - 컴파일이나 배포하는 동안 사용할 특별한 정보
 * - 실행하는 동안 사용할 특별한 정보
 * - 문법
 * @애노테이션이름(속성=값,속성=값, ...)
 * - 만약 속성 이름이 다음과 같이 'value'일 경우 생략가능
 * @애노테이션이름(value="okok")
 * ==> @애노테이션이름("okok")
 * - 그러나, 속성이 2개 이상일 경우는 value  이름을 생략할 수 없다.
 * @애노테이션이름("okok", age="20") // 오류!
 * ==> @애노테이션이름(value="okok",age="20") //OK
 */

/* 애노테이션 정의
 * - 애노테이션 유지 정책: @Retention()
 * .SOURCE (.class 파일에 없다. 컴파일 할 때 버려짐)
 * .CLASS (.class 파일에 존재, 컴파일러에게 제공할 정보)
 * .RUNTIME (.class 파일에 존재, JVM에게 제공할 정보)
 */
@Retention(RetentionPolicy.RUNTIME)
@interface Book {
/* 속성 정의 */
String value();

/* 속성 정의: 기본 값을 갖는 속성 */
int page() default 100;

String language() default "korean";

/* 속성 정의: 배열 */
String[] authors() default {""};
}

@Book("오호라..자바")
class Item {
int no;
int price;
}

@Book(
// "두번째"  // 인자값이 두개이상일때는 value이더라도 생략할수 없다.
value="두번째",
page=250,
authors="홍길동" // 배열값을 넣을 때 값이 한개일 경우 {} 생략 가능
)
class Item2 { }

@Book(value="세번째", authors={"홍길동", "임꺽정"})
class Item3 { }

public class AnnotationTest {

public static void main(String[] args) {
Item item = new Item();
item.no = 1;
item.price= 10000;

Class clazz = item.getClass();

Book book = (Book)clazz.getAnnotation(Book.class);
System.out.println(book.value());


// Class.forName("net.bitacademy.java41.test.Item2") == Item2.class
System.out.println("------------------------");
Book book2 = Item2.class.getAnnotation(Book.class);
System.out.println(book2.value());
System.out.println(book2.page());
System.out.println(book2.language());
System.out.println(book2.authors()[0]);

System.out.println("------------------------");
Book book3 = Item3.class.getAnnotation(Book.class);
System.out.println(book3.value());
System.out.println(book3.authors()[0]);
System.out.println(book3.authors()[1]);
}
}



2013년 9월 12일 목요일

[7주차 5일] Design Pattern - Iterator Pattern

/* Iterator 패턴
 * - 창고로부터 값을 꺼내는 방법을 객체화
 * - 값을 꺼내려는 개발자는 일관된 방식으로 메서드를 호출하여 값을 꺼낼 수 있다.
 * - 예)
 * 저장소: [ , , , , , , ]
 *
 * AscendentIterator : 값을 앞에서 부터 뒤로 순자적으로 꺼낸다.
 * DescendantIterator : 값을 뒤에서 앞으로 순차적으로 꺼낸다.
 * EvenIterator : 짝수번째 값만 순차적으로 꺼낸다.
 *
 * 프로그램의 일관성을 위해서 모든 꺼내는 역할자는 다음의 규칙을 따른다.
 * - hasNext() : 꺼낼게 있냐?
 * - next() : 꺼내라!
 */

interface Iterator {
boolean hasNext();
Object next();
}

class AscendentIterator implements Iterator {
ArrayList list;
int cursor;

public AscendentIterator(ArrayList list) {
this.list = list;
this.cursor = 0;
}

@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor++;
return value;
}
}

class DecendantIterator implements Iterator {
ArrayList list;
int cursor;

public DecendantIterator(ArrayList list) {
this.list = list;
this.cursor = list.size() - 1;
}

@Override
public boolean hasNext() {
if (cursor > 0) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor--;
return value;
}
}

class EvenIterator implements Iterator {
ArrayList list;
int cursor;

public EvenIterator(ArrayList list) {
this.list = list;
this.cursor = 0;
}

@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Object value = list.get(cursor);
cursor += 2;
return value;
}
}



public class IteratorTest {

public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1111");
list.add("2222");
list.add("3333");
list.add("4444");
list.add("5555");
list.add("6666");
list.add("7777");
list.add("8888");
list.add("9999");

// Iterator iterator = new AscendentIterator(list);
Iterator iterator = new DecendantIterator(list);
// Iterator iterator = new EvenIterator(list);
while ( iterator.hasNext()) {
System.out.println(iterator.next());
}

}

[7주차 5일] properties

-주석: #

# key=value(CRLF)
# name=hong
# ISO-8859-1
# mutibyte character => \uXXXX

[7주차 5일] Reflection API

2013년 9월 11일 수요일

[7주차 4일] Transaction

: 여러개의 Data변경 작업을 하나의 작업으로 묶은 것.
Data 처리를 한번에 관리하기 위함.


commit
: 작업 승인

rollback
: 작업 취소


[7주차 4일] 객체간의 관계와 UML Diagram

1. Extends (상속관계)

2. Dependency (의존관계)

3. .Association (일반관계)

4. Aggregation (집합관계)

5. Composition (포함관계)

[7주차 4일] Persistence Layer & Presentation Layer

Persistence Layer
: 서버에서 UI처리를 담당

Presentation Layer
: 서버에서 Data처리를 담당

[7주차 3일] 스프링의 기초

[7주차 3일] Facade Pattern

스프링의 기초가 되는 디자인 패턴

2013년 9월 10일 화요일

[참고] Github

www.github.com        (개인 Repository 무료  없음)
www.bitbucket.com   (개인 Repository  5개까지 무료)

collaborator 등록할 때 이름으로 검색해라
아이디 아니다 이거땜에 개고생 했음

2013년 9월 9일 월요일

[7주차 2일] Filter

: Chain of Responsibliry Pattern 을 이용


/* 특징
 * - 필터는 서블릿 컨테이너가 관린한다.
 * - 필터 객체는 서블릿과 마찬가지로 하나마나 생성된다.
 * - 웹 애플리케이션이 종료 될 때까지 유지된다.
 */
public class CharSetFilter implements Filter {
FilterConfig config;

// 필터가 생성될 때 딱 한번 호출된다.
// 필터가 자신의 일을 수행하는데 필요한 객체를 준비한다.
// 준비할게 없다면 그냥 내비둔다.
@Override
public void init(FilterConfig config) throws ServletException {
// config  파라미터는 필터의 설정정보를 조회하는데 사용한다.
// 호출될 때 별도 저장할 필요가 있다.
this.config = config;
}

// 매번 필터가 적용될 때 마다 호출된다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException {

}

// 웹 ㅐ플리케이션이 종료되어 데이터가 삭제되기 전에 호출된다.
// init()에서 준비한 객체를 해제하는 작업을 수행한다.
// 해지할게 없다면 그냥 내비 둔다.
@Override
public void destroy() {

}

[7주차 2일] Chanin of Responsibility Pattern

: 기능의 삽입을 쉽게 다루기 위해 방안
:  기능의 앞뒤로 필요하거나 필요없는 기능들(log, 암호화, 압출해제 등...)을 Chain방식으로 추가 했다 제거 했다 할수 있는 방법

* 기능 추가가 쉽다.

[7주차 1일] Expression Language

${ } 로 간단하게 표시하는 문법

[7주차 1일] pageContext

ServletContext, HttpSession, ServletRequest와 같이 저장소의 하나로
해당 JSP에서 만 유효한 저장소이다 forward를 하더라고 값이 유지되지 않는다.

그러므로,  실질 적으로 사용할 일이 없다.

개념적으로 만 알고 넘어가자!

2013년 9월 8일 일요일

[7주차 1일] HashMap, HashTable ...

Hash 라고 들어가는 것들..

HashCode의 index로 관리한다.

List 보다 찾는 속도가 빠르다.

* 키값으로 클래스를 사용하고 싶은 경우에는 해당 클래스에 꼭 hashCode()와 equals() 를 오버라이딩 하고 사용해라

[7주차 1일] HashCode

// fully-qualified class name + '@' + hashCode
System.out.println(s1.toString());
// 결과 예) test.HashTest01$Student@3c635421

// hashCode: 해당 인스턴스를 구분하는 ID값
System.out.println( Integer.toHexString(s1.hashCode()) );
//결과 예) 3c635421

 Hash Code?
 - 데이터를 구분하기 위한 ID
 - 원본 데이터를 특별한 계산공식(알고리즘)을 이용하여 짧은 ID값을 뽑아낸다.
 - 특별한 계산공식? MD4, MD5, SHA-1, ...
  . MD4(Message Digest) : 16byte
  . MD5 : 16bbyte
  . SHA-1 : 20byte
  . SHA-256 : 32byte

* 특별한 공식:  원본 데이터를 구분할 수 있는 값을 리턴.

* HashCode는 원본 데이터를 비교하면 시간이 너무 많이 걸리기 때문에 원본이 같은지 여부를 빠르게 비교하기 위해서 특별발 공식에 의해서 ID값을 뽑아내게 되는게 이때, 다른 데이터가 같은 ID를 가질수 있기 때문에 항상 오류의 가능성을 내포하고 있다.

[7주차 1일] JSTL

기존의 JSP는 결국에 는 Java파일로 된다.

JSF(Java Server Face)
기존의 JSP에 (html + css + javascript로 전환되는)태그들을 추가.
동적인 UI를 출력한다.
정적인 화면 때문에 한계가 있기때문에 현재 많은 주목은 받고 있지 못한 상황이다.


JSTL(Jsp Standard Tag Library)
: 자바코드를  없애자는 목표


두개의 lib 모두 있어야 한다.
javax.servlet.jsp.jstl-1.2.1.jar
javax.servlet.jsp.jstl-api-1.2.1.jar



Expression Language
. ServletContext, HttpSession, ServletRequest 등으로 부터 좀 더 쉽게 꺼내고,
. VO 객체의 getXXX() 메서드 호출을 좀더 쉽게 하기 위해 등장한 문법.
. ${applicationScop.XXX}  <== ServletContext
. ${sessionScop.XXX}  <== HttpSession
. ${requestScop.XXX}  <== ServletRequest
. ${pagetScop.XXX}  <== PageContext
. ${xxxx} <== PageContext > ServletRequest > HttpSession > ServletContext



Property
: getter / setter 의 이름에서 get/set을 제거 하고 첫문자를 소문자로 한것.
read only , write only , read/write property 가 있다.

* property는 변수명이 아니다!!

2013년 9월 5일 목요일

[6주차 5일] div태그

. 콘텐트를 놀리적으로 구분하여 표현.
. block 타입: 라인 전체를 점유.

[6주차 5일] include

: 메서드 호출 하듯이 서블릿 간에제어권을 줬다가 다시 가져오는 방식.

사용법
request.getRequestDispatcher("/auth/LoginForm.jsp")forward(request, response)
<jsp:include page="header.jsp"></jsp:include>

2013년 9월 2일 월요일

[6주차 2일] GET 방식 & POST 방식

[6주차 2일] 자동요청 방식_Redirect & Refresh

Redirect  방식

- sendRedirect("URL");





Refresh 방식



- setHeader("Refresh", "1;url=URL");
- <html><head><meta http-equiv="Refresh" content="1;url=URL"></head>...

[6주차 2일] HTML

<!DOCTYPE html>    <== 사용되는 테그 형식 선언 (html: root Elemnet 이름)
<html>      <== root Elemnet (시작 태그)
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>      <== root Elemnet (끝 태그)


Element
: Start Tag + Content + End Tag

root Element
: 가장 바깥 쪽에 있는 element

* 하나의 파일에 root element는 하나만 존내 해야 한다.


 head 태그

: 웹 브라우저에게 이 문서에 대한 부가 정보를 제공한다.

title 태그
: 웹브라우저의 타이틀바에 출력 또는 탭에 출력된다.

body 태그

: 웹브라우저 내용창에 출력할 것을 기술



[6주차 2일] Login을 통한 Web Application Flow

2013년 9월 1일 일요일

[6주차 1일] DB Modeling 2

Foreign key

: 테이블과 테이블 사이의 관계를 맺는 방법 (다른테이블의 PK)

무결성 유지
- 존재하지 않는 PK에 대한 입력방지
- 자식 Data가 있는 경우 삭제 방지


* RDBMS: 관계형 DB

관계
1) 식별관계
  FK == PK

2) 비식별 관계
  FK != PK
 

[6주차 1일] Web Application Flow



* 실무에서는 Web Server와 WAS를 분리해서 Static Resource는 WAS를 경유 하지 않고도 Web Server만으로 처리하도록 하는 경우가 많다.

[6주차 1일] DB Modeling 1

: 데이터의 구조와 상관 관계를 표현.
 시스템이 다루는 Data를 빠르게 이해 할 수 있다.

* 모델링: 생각하고 있는 것을 글이나 그림으로 표현


1) 테이블 정의

컬럼식별
Data를 구분하기 위한 키 선정


2) 정규화 수행

Data중복제거
  - 메모리 절약
  - Data의 신뢰성 향상 (무결성)


방법
 i) 제 1 정규화
   - 중복 컬럼 제거
   - 중복 Data 제거
   - 별도 테이블 정의
   - 자식 관계를 맺는다.

ii) 제 2 정규화
   - PK가 2개 이상일 경우

iii) 제 3 정규화
   - 어떤 컬럼이 PK가 아닌 일반컬럼에 종속되는 경우
       ==> 별도 테이블 분리 - 부모자식 관계 맺는다.


3) 도메인 정의

컬럼들을 분류하여 하나의 타입으로 정의
도메인을 컬럼에 설정
컬럼의 정의를 쉽게 변경할 수 있다.


4) DBMS에 종속적인 물리 모델 정의

5) 모델을 SQL문으로 전환