Webframework1-2
스프링MVC에 관한 것들을 적어두었음
hibernate는 ORM(Object Relational Mapping)을 도와주기 위한 solution중 하나이다
hibernate을 통해서 jdbc를 접속하게되는데
→spring에서 hibernate api를 통해서 접속
→hibernate에서 jdbc api를 통해서 접속
→jdbc에서는 원하는 값을 Resultset형식으로 리턴해주고
→hibernate에서는 그 Resultset형식을 domain object형식으로 사용자에게 건내준다
hibernate를 사용하기 위해 필요한건
configuration
sessionFactory
mapping
Configuration은 dao-context.xml파일에서 지정해주거나, hibernate.cfg.xml에서 지정해주면됨
세부내용
dataSource → 연결된 db에 관한 정보들을 넣어줌
sessionFactory
위에 빈으로 설정해준 dataSource
packagesToScan(model)
hibernate의 설정
<prop key="hibernate.show_sql">true
<prop key="hbm2ddl.auto">create
transcationManager(위에서 설정한 sessionFactory)
component-scan(dao)
SessionFactory
→hibernate에서는 session을 만들어서 db와의 데이터를 주고 받는다
선언하는법
SessionFactory를 @Autowired로 dependency injection을 통해서 주입받는다
sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session밑의 get(원하는타입.class, save한 serializational한 값), saveOrUpdate(), delete(), flush(), close(), createQuery()
tx.commit();
session.close();
sessionFactory.close();
이렇게 단계를 거쳐서 접근한다
하지만 만약에 @Transactional이라는 주석을 사용하게되면
굳이 sessionFactory를 위처럼 객체를 만들고, transaction을 만들고 openSession, beginTransaction으로 시작안하고 commit도 안해도 된다
그냥 Session = sessionFactory.getCurrentSession()을 이용하게되면 현재의 session을 가져오게되고 만약 session이 없다면 새로운 session을 만들어준다
그러면 @Transactional이라는 주석을 붙히면 필요한건 sessionFactory.getCurrentSession과 session의 메소드들(get, save, saveOrUpdate, delete, close, flush, createQuery)만이 남게 된다
createQuery 사용
createQuery의 인자로 들어가는것은 HQL(Hibernate Query Language)과 해당 클래스이다
select을 수행시 .getResultList() 을 통해서 확인할 수 있고
update을 수행시 .executeUpdate() 을 통해서 db에 적용시킬 수 있다
Session Object States
Transient
Detached
Persistent
JPA(Java Persistance Api)
Mapping
cascade = CascadeType
ALL, PERSIST, MERGE, REMOVE, REFRESH
@Repository @Transaction
@Entity @Table(name="~")
@Id @GenerateValue(strategy.GenerationType.IDENTITY .AUTO .TABLE) @Column(name="~")
@Transient
@ManyToOne 단방향시
one쪽에는 딱히 해줄껀 없고
many쪽에는 이렇게
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="~")
2개를 넣어줌
@ManyToOne 양방향시
one쪽에는
@OneToMany(mappedBy="many측에서의 변수", cascade=CascadeType.ALL)
이렇게 넣어주고
many쪽에는
@ManyToOne
@JoinColumn(name="~")이렇게만 넣어준다
@OneToOne 단방향시
사용되는쪽은 할거없고
사용하는쪽에서
@OneToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(unique=true, name="~")
이렇게 넣어준다
@OneToOne 양방향시
사용되는쪽에서
@OneToOne(mappedBy="사용하는측에서의 변수이름", cascade=CascadeType.ALL)
이렇게 넣어주고
사용하는쪽에서는
@OneToOne(optional=false)
@JoinColumn(unique=true, name="~")
이렇게만 넣어준다
@ManyToMany 사용시
사용되는쪽에서는 할거 없고
사용하는쪽에서
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="", joinColumns={@JoinColumn(name="")}, inverseJoinColumns={@JoinColumn(name="~")}
@OneToMany(mappedBy="밑에서사용하는변수" @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @OneToOne(optional=false, cascade=CascadeType.ALL) @JoinColumn(unique=true, name="") @ManyToMany(cascade=CascadeType.ALL) @JoinTable(name="", joinColumn={@JoinColumn(name="")}, inverseJoinColumn={@JoinColumn(name="")
Hibernate와 SpringFramework을 연동하는 방법
Maven Dependency
hibernate-core, spring-orm 두 태그가 들어가야함
Spring Bean Configuration → datasource, sessionfactory, transactionmanager
hibernate.cfg.xml이나 dao-context.xml에 저장
datasource요소들
driverClassName
url
username
password
sessionFactory요소들
datasource
packagesToScan
hibernateProperties
show_sql ⇒ true
hbm2ddl.auto ⇒ create나 update
hibernate.dialect
transactionmanager
transaction-manager="transactionManager"
sessionFactory
DAO Bean
component-scan : base-package=dao
entity bean
dao layer
REST = REpresentational Status Transfer
url, id값으로 resource를 분류한다
resource의 표현은 xml, json, text등 으로 표현할 수 있다
RESTful Web Service는 decupling을해줌, client와 server의 분리한다. 그리고 platform agnostic, 즉 client의 platform에 상관없이 같은 것을 제공해준다는 의미
RESTful Web Service의 중요한 요소 3가지는
method
message
resource
HTTP Request Message
method + requestURL + httpversion
header
blank
body
HTTP Response Message
httpversion + status code + phrase
header
blank
body
Addressing
⇒ resourceType/resourceId
복수형을 사용하라
공백쓰지말고 _ 써라
소문자쓰라
안쓰는 url은 사용중인 url로 redirection시켜라
url에 http method가 들어가면 안좋음
METHOD
GET, POST, PUT, DELETE
OPTION ⇒ 어떠한 http method을 유지할것인가
HEAD ⇒ body는 없이 header만 보낼때
CACHING
public
private
no-store
max-age
must-revalidate
ETag ⇒ resource의 version값으로, 이 값으로 변경사항이 있는지 확인 / 304 Not Modified
Controller → 객체를 return한다
객체를 JSON화 시키는 것은 Serialization 이라고 하고, 이것은 server에서 client로 값을 response해줄때 컨트롤러에서 리턴하는 객체를 json화 시켜서 전송해준다
JSON을 객체화 시키는 것은 Deserializaion이라고하고, 이것은 client가 server로 json을 전송할때 server에서 deserialization이 이루어진다
⇒이것은 jackson-databind 라는 library를 통해서 사용할 수 있는 기능임
@ResponseBody는 컨트롤러에서 객체를 리턴해줄 때, http의 body부분에 그 객체를 넣어주는 개념이다, 클래스에 사용하고, 위치는 접근지정자 다음에 적어주면 된다
@RestController = @Controller + @ResponseBody
@RequestBody는 client에서 보낸 http request의 body에 있는 내용을 객체로 바인딩시켜주는 단계
@PathVariable(value="RequestMapping과 같은 url매핑단계에서의 변수가 들어간다") 타입 변수
이렇게 사용하면 url에서의 변수값을 이 주석뒤의 변수에 집어넣는 것이 가능
ResponseEntity<타입>
여기에는 http reponse의 내용이 들어가게 된다
status code
header
body
Spring Configuration
XML based configuration
Annotation based configuration
Java based configuration
@Configuration
이건 bean을 정의하는 메서드임
이걸 선언한 함수안에서 @Bean 주석을 사용해서 bean을 만들어냄
@Component의 강화된 버전이기 때문에
이걸 선언한 함수도 bean이 됨
왜 SpringFramework를 사용하냐?
객체들간의 의존성을 줄이기 위해서 → Dependency Injection을 사용해서 의존성을 줄인다
객체를 다른 클래스에서 사용하기 위해서는 new키워드를 사용해서 쓰는데 이건 의존성이 너무 높다
Plumbing, BollerPlate 코드를 줄인다 ⇒ 필요하지만, businesslogic에는 쓸모없는 코드이기 떄문에 spring에서 해줌으로써 신경을 안써도 됨, 필요하면 abstraction이용해서 추가하면됨
다른 framework와 통합이 쉬움 ⇒ 서드파티의 framework들을 사용하기가 편리하다
Last updated
Was this helpful?