@OneToMany를 사용하면 mappedBy속성을 사용하게 된다. 왜 필요할까?

 

양방향이라는 말은 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것처럼 보이게 할 뿐이다. 데이터 베이스 테이블은 외래키 하나로 양쪽이 서로 조인할 수있다.

 

테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다. 엔티티를 단방향으로 매핑하면 참조를 하나만 사용하므로 이 참조로 외래키를 관리하면 된다.

두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인이라고 한다.

 

 

연관관계의 주인만이 데이터 베이스 연관관계와 매핑되고 외래키를 관리할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.

 

주인은 mappedBy 속성을 사용하지 않는다.

주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야한다.

 

연관관계 주인을 정한다는 것은 사실 외래키 관리자를 선택하는 것이다.

양방향 관계에서 JPA 연관관계 주인은 외래 키가 있는 곳을 설정하라

@JoinColumn : 외래 키를 매핑할 때 사용한다.

name = 매핑할 외래 키 이름

referencedColumnName = 외래 키가 참조하는 대상 테이블의 컬럼명

foreginKey(DDL) 외래 키 제약조건을 직접 지정할 수 있다.

 

@ManyToOne 어노테이션은 다대일 관계에서 사용한다.

 

 

내 생각


 

그럼 회원의 주문 정보를 저장한다고 했을 때 회원은 상품 리스트를 1개 이상 가질 수 있고, 상품 리스트는 회원을 1명 이상 가질 수 있으며 회원 정보를 읽을 수만 있지 상품에서 회원을 넣을 수 없다고 가정했을 때

 

-User

@ManyToOne

private List<Goods> list;

 

-good

@OneToMany(mappedBy = "Order_list")

private List<User> user;

 

mappedby가 없다면 -good의 데이터베이스에서 회원을 넣을 수 있게 되며 회원이 상품을 선택해야 하는 상황에 상품도 회원을 선택하는 것이 되므로 말이 안 되는 상황이 된다. 상품은 회원을 읽을 수만 있고 쓰지는 못한다. 그런데 왠지 주문 리스트를 데이터베이스에 따로 두고 user와 goods을 조인하지 않을까 한다.

웹 어플리 케이션의 폴더 구조를 사용해야한다. 서블릿/JSP 규약은 웹 어플리케이션이 특정 폴더 구조를 따르도록 제한하고 있기 때문이다. 

WEB-INF: 웹 어플리케이션 설정 정보를 담고 있는 web.xml 파일이 위치

WEB-INF\classes:  웹 어플리케이션에서 사용하는 클래스 파일이 위치한다.

WEB-INF\lib: 웹 어플리케이션에서 사용하는 jar파일이 위치한다.

 

 

Note: 웹 어플리케이션이 JSP 코드로만 구성될 경우 web.xml 파일을 작성하지 않아도 되지만,

1. 서블릿을 직접 설정하는 경우

2. 리스너를 직접 설정하는 경우

3. 특정 URL 에 속하는 JSP들에 대해 공통 속성값을 설정하는 경우

 

이 기본적인 구조에서 spring으로 넘어가면 더 많은 구조를 같는 것 같다.

 

src/main/파일이름 : Controller나 DB 및 기타 백엔드에서 사용될 자바 코드들이 구현되는 곳

resource : img, 파일이나 css파일을 보관하는 곳

spring : 스프링 설정 파일을 보관하는 곳

view : 뷰 페이지 사용자가 직접 보게 되는 곳 (view 하위 폴더를 만들어 구분 지을 수 있지 않을까 생각한다.)

오늘 GET방식과 POST방식 전송에 대해서 공부했다. 나중에 다시 볼 수 있도록 간략하게 정리

 

클라이언트에서 서버로 정보를 요청하는 방식 중에서 GET과 POST 방식이 있다.

 

 

GET:

GET 방식은 클라이언트에서 서버로 데이터를 전달할 때 -> 주소?값 이다

주소창에 쿼리 스트링이 보이기 때문에 보안성이 떨어진다. 또한 전송 데이터의 제한이 있다.

 

POST: 

POST 방식은 GET보다는 많은 데이터를 보낼 수 있다.

또하 주소창에 전송하는 데이터가 노출되지 않는다. 

 

 

GET과 POST

GET은 주로 데이터를 요청할 때 사용되며 POST는 데이터를 전달할 때 사용을 한다.(로그인, 패스워드에 많이 사용되지 않을까 생각한다.)

 

 

서버에서는 doGet과 doPost 등이 이들의 요청을 수행한다. get -> doGet, post -> doPost로만 수행되며

만일 get이 doPost를 요청한다면 에러가 발생한다.

오늘 의존성 주입을 연습했다.. 별거 아닌라고 생각했지만 xml 파일로 만들어 보니 어려웠다. maven은 재미있게 공부 한 것 같다. 공부한 개념을 정리해보았다. 아직 공부중이라 많이 부족한 부분이 많다..

 

개념 정리


Bean: IOC container가 관리하는 자바객체

IOC(제어권 역전): 프로그램의 생명주기에 대한 주도권이 웹 애플리케이션 컨테이너에 있다.

의존 관계 역전 원칙: 1. 하이레벨 모듈은 로우레벨 모듈에 의존해서는 안되고, 모두 인터페이서에 의존해야한다.

                            2. 추상화는 세부 사항에 의존해서는 안된다.

MAVEN: Java의 프로젝트 관리 도구로 사용된다. Java에서 사용되는 문서를 중앙서버에 관리하며 프로젝트에 주입해야 할 경우 서버에서 데이터를 받아와 내 저장소에(.m2 repositery) 저장된다. 

 


MAVEN

 

POM.xml 에 내가 원하는 라이브러리 내용을 넣어 사용한다.  https://mvnrepository.com/ 에 자바에서 사용되는 패키지들이 들어있다. 

 

사용하기 위해서는 빨간색 박스의 내용을 클릭하고 <dependencies>안에 집어 넣는다.

그리고 프로젝트 우클릭 후 MAVEN에 Project Update를 해야한다.

DI와 IOC연습


의존성 주입을 하기 위해서는 id와 class가 필요하다. 해당 객체가 있는 클래스의 package name과 사용될 id를 bean에 넣는다. 이렇게 정의를 해놓으면 생성자의 의미로 사용될 수 있다.

첫 번째 bean은 exam = new NewLecExam()이고 

두 번째 bean은 console = new GridExamConsole(exam)이다.

 

 

오늘 아주 간단한 웹을 만들어 봤다.  웹이라고 불러도 민망하지만 아직 신기하고 재미있었다.

유튜브에서 나온 내용을 따라 해 봤다. 실행을 하고 나니.. 

 

알 수 없다는 오류가 뜬다... 그런데 url에 /hello로 바꾸니 원하던 내용이 뜬다.. 매핑이 잘못된 건가..? 어디가 잘못되었는지 아직은 잘 모르겠다.. 아직 공부가 부족해서 이해를 못하는 것인가..

 

Annotation을 이용해서 URL을 매핑 할 수 있다고 한다.

사용하고자 한다면 web-app에 이 정보를 넣어야 한다고 한다. 기본은 true지만 false로 바꿔줘야 하는데 그렇지 않으면 매핑을 하고자 할 때 Annotation 매핑 정보를 읽어 들이지 않는다고 한다.

클래스 위에 @webServlet을 하니 잘 작동이 된다. 아까 404페이지가 뜨는 이유가 매핑정보가 잘못돼서 안 되는 것이지 않을까 생각한다.

 

오늘 스프링 공부 시작을 했다. 책을 주문했지만 책이 오지 않아서 유튜브를 보면서 공부하는 중이다.

유튜브에서 자바와 스프링 설치를 마치고 처음으로 접한 것이 의존성 주입이라는 것이다.

 

의존성 주입은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. 

의존성 주입의 의도는 객체의 생성과 사용의 관심을 분리하는 것이며 이는 가독성과 코드 재사용을 높혀준다. 

 

의존성 주입은 사용될 서비스 객체, 사용하는 서비스에 의존하는 클라이언트 객체 클라이언트의 서비스를 사용 방법을 정의하는 인터페이스 , 서비스를 생성하고 클라이언트로 주입하는 책임을 갖는 주입자 를 전재로 한다.

 

위키백과- 의존성 주입

 

의존성 주입의 이점으로는 

1. 의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈간의 결합도를 낮출 수 있다.

2. 코드 재사용을 높여서 작성된 모듈을 여러 곳에서 소스코드의 수정없이 사용할 수 있다.

3. 모의 객체 등을 이용한 단위 테스트의 편의성을 높여준다.

 

의존성 주입 패턴으로는

생성자 주입, 세터를 통한 주입, 인터페이스를 통한 주입 등이 있다.

 

위키백과에 있는 것을 조금 정리해 보았다. 이것만 봐서는 무슨 소리인지 잘 모르겠다. 

 

TEST A:

TEST B:

 

XML:

MAIN:

유튜브에서 한 것을 비슷하게 만들어 봤다. 객체를 직접 생성하지 않고 xml을 통해서 데이터를 받는 것이다.

직접 객체를 생성하는 것이 아니라 외부로 부터 데이터를 받는다고 한다. 만들면서 xml 파일 만드는게 이해가 잘 안되고 name과 class 경로도 맞게 했는데 오류가 났다가 갑자기 사라졌다... 아직 미숙하기에 좀 더 사용 해봐야 할 것 같다.

+ Recent posts