💙 들어가며
웹개발을 위해서 내가 담당해야 하는 서비스의 업무로직을 찾아보자.
그리고 자바 코드로 구현하는 방법에 대해서 알아보자.
✏️ 학습내용 정리
#업무로직 / 트랜잭션 / 서비스함수
본격적으로 데이터를 화면에 출력하기 전에 알아야 할 단어가 있다.
업무로직/트랜잭션/서비스 함수 3가지!
💡 업무로직 / 트랜잭션 / 서비스함수
3가지는 같은 말이다.
업무단위를 서비스 함수로 만들 수 있어야 하고,
서비스 함수를 트랜잭션 단위로 실행시킬 수 있어야 한다.
한 페이지 내에서 사용자가 요청할 수 있는 것이 곧 해당 페이지에서 일어날 수 있는 업무이다.
페이지가 열리자 마자 나오는 정보까지 포함한다.
요청사항이라고 하면 마우스와 키보드로 명령을 내리는 것을 의미한다.
(윈도우는 마우스가 기준이기 때문에 한 페이지 내에서 마우스로 접근할 수 있는 것이 바로 업무로직이다.)
EX: 메뉴목록 보여줘(O) 주문하기 할래(다른페이지로 이동하게 되니 X)
업무에서 수반하고 있는 로직이 업무로직이다.
실제 업무로직은 사용자가 요청하는 데이터를 보여주는 것이다.
서비스 함수는 업무로직을 담당하는 함수이고,
업무단위를 트랜잭션(하나의 업무를 하기 위해서 필요한 코드단위)이라고 한다. (트랜잭션의 단위는 함수다.)
그렇다면 다음 화면에서 업무로직은 무엇일까?
아래 5개가 이 페이지에서 일어날 수 있는 업무로직이라고 할 수 있겠다.
🔎 아래 페이지에서 일어날 수 있는 업무로직 (총 5개)
기본전제: 이 페이지 안에서 일어날 수 있는 데이터 요청사항, 페이지가 열리자마자 나오는 것들 포함!!!
1. 카테고리별 메뉴목록 조회
2. 검색별 메뉴목록 조회
3. 기본 메뉴목록 조회
4. 좋아요
5. 메뉴 담기
#인터페이스를 사용하자
그렇다면 위의 5가지를 메뉴 페이지를 구성하는 업무라고 보고(서비스 단위라고 보고)
메뉴서비스를 자바로 만들어보자.
이때 클래스로 할 것인지 인터페이스로 할 것인지를 잘 선택해야 한다.
클래스는 해당 서비스의 이름을 명시하는 것과 같은 강한 결합력을 나타내기 때문에
결합력을 낮추기 위해서 인터페이스를 사용한다.
💡 결합력이란?
딱 집어서 얘를 쓰겠다고 하지 않고 역할자로 지정하게 되면 자유롭게 붙었다 떨어졌다 할 수 있다.
역할명으로 찝어서 이야기 해줘야지 이름으로 부르게 되면 강한 결합력이 생기기 때문에
수정이 용이하지 않다.
인터페이스는 접점이라는 뜻이다. 따라서 붙었다는 의미와 동시에 떨어졌다는 의미를 가지게 된다.
그래서 우리는 인터페이스를 사용한다. 인터페이스가 곧 이름이 아니라 역할명이 된다.
(EX) 트리구조의 조직도를 구성한다고 가정해보자.
<이름을 기준으로 작성했을 때>
홍길동
-임꺽정(부장)
-돌쇠
-장발장
-유재석(부장)
-하하
-박명수
-노홍철
<역할명을 기준으로 작성했을 때>
홍길동
-부장 //여기에는 임꺽정도 올 수 있고, 유재석도 올 수 있다.
-돌쇠
#인터페이스 구현
위의 다섯가지 메뉴를 인터페이스로 구현하기 위해서 메소드를 만들어보자.
이때 목록조회와 관련된 메소드가 3개가 나오는데 각각 이름을 특화시킨 개별함수로 만들지
아니면 매개변수를 다르게 받는 오버로드 함수로 만들지에 대해서 장단점을 고려해서 만들면 된다.
개별함수 만들기 | 통합함수 만들기(오버로드) | |
장점 | 이름이 특화되어 있어서 사용하는 사람 입장에서 이해도가 높다. |
하나의 함수로 통합하여 별도의 조건처리 없이 매개변수만 다르게 주면 바로 사용할 수 있다. |
단점 | 사용하기 위해서 각 함수마다 별도로 조건처리를 해줘야 한다. |
함수만 보고서는 바로 이해할 수 없기 때문에 매개변수의 특징 등에 대해서 별도로 익혀야 할 필요가 있다. |
각각 개별 함수로 한 번 메소드를 작성해보자.
이제부터는 Null값도 고려해야 하는데, 기본형은 Null값이 올 수 없기 때문에 Null값을 처리할 수 없다.
그래서 기본형은 Boxing한 Wrapper Class를 사용한다.
💡 인터페이스를 구현해보자. (매개변수까지 고려하기!)
public interface MenuService {
//기본목록 조회
List<Menu> getList();
//카테고리별 목록조회
//카테고리 아이디
List<Menu> getListByCategoryId(long categoryId);
//검색목록 조회
//메뉴이름
List<Menu> getListByName(String name);
//좋아요
//누가 무슨 메뉴를 좋아요했는지 다 고려
//여기서 memberId는 Null값이 올 수도 있으니 Wrapper타입으로 쓴다.
void like(long id, Long memberId, boolean on);
//메뉴담기
//누가 무슨 메뉴를 추가했는지 다 고려
//여기서 memberId는 Null값이 올 수도 있으니 Wrapper타입으로 쓴다.
void addToCart(long id, Long memberId);
}//class ends
다음에는 속성값을 가지고 있는 Menu 클래스를 별도로 만들 것인데,
service라는 패키지 말고 entity라는 별도의 패키지를 만들어서 클래스를 생성한다.
기본적으로 속성, 생성자, getters/setters, toString은 만들어둔다.
생성자는 기본 생성자를 포함해서 최소 2개는 만든다.
💡 Menu class 만들기 (entity라는 별도의 패키지를 준비한다.)
//entity라는 별도의 패키지에 만들어둔다.
package kr.co.rland.app.entity;
//JAVA에서 날짜 관련된 자료형은 util의 Date를 사용한다.
import java.util.Date;
public class Menu {
/* ------------ Member Variables ------------ */
// 속성
//1. 데이터베이스 테이블 속성 그대로
//2. 구분자 형태만 바꾸기(하이픈->대소문자)
private long id;
private String korName;
private String engName;
private int price;
private String img;
private Date regDate;
private int hit;
private long memberId;
/* ------------ Constructor ------------ */
// 생성자(최소 2가지)
public Menu() {
// TODO Auto-generated constructor stub
}
public Menu(long id, String korName, String engName, int price, String img, Date regDate, int hit, long memberId) {
super();
this.id = id;
this.korName = korName;
this.engName = engName;
this.price = price;
this.img = img;
this.regDate = regDate;
this.hit = hit;
this.memberId = memberId;
}
/* ------------ getters/setters ------------ */
// getters/setters
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getKorName() {
return korName;
}
public void setKorName(String korName) {
this.korName = korName;
}
public String getEngName() {
return engName;
}
public void setEngName(String engName) {
this.engName = engName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
public long getMemberId() {
return memberId;
}
public void setMemberId(long memberId) {
this.memberId = memberId;
}
/* ------------ toString ------------ */
// toString
@Override
public String toString() {
return "Menu [id=" + id + ", korName=" + korName + ", engName=" + engName + ", price=" + price + ", img=" + img
+ ", regDate=" + regDate + ", hit=" + hit + ", memberId=" + memberId + "]";
}
}//class ends
그럼 아래의 경우에서는 업무로직이 몇개일까?
🔎 아래 페이지에서 일어날 수 있는 업무로직 (총 4개)
기본전제: 이 페이지 안에서 일어날 수 있는 데이터 요청사항, 페이지가 열리자마자 나오는 것들 포함!!!
★입력과 요청은 다르다.
때문에 사이즈, 옵션 수량 선택은 요청사항이 아니라 입력이다!
1. 담기
2. 추천메뉴 좋아요
3. 상세페이지 보기 getById()
4. 추천메뉴 보기 getRecommendListById()
(꿀팁) 옵션이 2개뿐일 때에는 isSmall, isHot과 같이 메소드를 쓰고 boolean값으로 받는다.
💙 마치며
1.
업무로직 찾는 것이 엄청 어렵다..
어디까지가 한 페이지 내에서 일어나는 일인지
알기가 어려운 것 같다.
해보면서 파악해가는 방법밖에 없는 것 같다.
2.
이름을 특화시킨 개별함수로 만들지
오버로드 함수로 같은 이름을 돌려쓸지
장단점에 대해서 잘 이해하고
업무로직을 짜야겠다!
'SQL' 카테고리의 다른 글
[뉴렉처 6기] MyBatis를 활용한 DAO(Repository) 구현하기│SqlSessionFactory│SqlSession (0) | 2023.08.30 |
---|---|
[뉴렉처 6기]가변길이 배열 │컬렉션│Object│제네릭(230829) (0) | 2023.08.29 |
[뉴렉처 6기] Maven 프로젝트│예외처리(230828) (0) | 2023.08.28 |
[뉴렉처 6기] DATABASE│제약조건│도메인│엔티티│관계(230825) (0) | 2023.08.25 |
[뉴렉처 6기] DATABASE│정규화│1NF│2NF│3NF(230824) (0) | 2023.08.24 |