MemberController 코드 리뷰
package com.multi.erp.member;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MemberController {
MemberService service;
public MemberController() {
}
@Autowired
public MemberController(MemberService service) {
super();
this.service = service;
}
@GetMapping("/emp/login.do")
public String login() {
return "login";
}
@PostMapping("/emp/login.do")
public ModelAndView login(MemberDTO loginUserInfo , HttpServletRequest request) {
System.out.println("===============loginUserInfo================="+loginUserInfo);
ModelAndView mav = new ModelAndView();
MemberDTO user = service.login(loginUserInfo);
String view = "";
if(user != null) {
//로그인 성공
HttpSession session = request.getSession(); //세션만들기
//세션에 데이터 공유하기
session.setAttribute("user", user);
view = "redirect:/index.do";
}else {
//로그인 실패
view = "redirect:/emp/login.do";
}
mav.setViewName(view);
return mav;
}
@RequestMapping("/emp/logout.do")
public String logout(HttpSession session) {
if(session != null) {
//사용하던 세션을 메모리에서 제거하기
session.invalidate();
}
return "redirect:/emp/login.do";
}
}
이 Java 파일은 Spring 프레임워크에서 사용하는 컨트롤러 클래스 이며 컨트롤러는 클라이언트의 요청을 처리하고
적절한 서비스를 호출하여 비즈니스 로직을 수행하고 그결과를 뷰에 전달하는 역활을 한다.
- "@Controller" 어노테이션은 이클래스가 스프링 MVC의 컨트롤러 클래스임을 나타낸다.
- "@MemberService"는 비즈니스 로직을 처리하는 서비스 클래스다 "@Autowired"어노테이션은 이서비스를 자동으로 주입(Dependency Injection)한다.
- "@GetMapping" 과 "@PostMapping" 어노테이션은 HTTP요청메서드(GET,POST)에 따른 매핑을 나타낸다. 이들은 클라이언트의 요청을 해당 매서드로 매핑하는 역활을 한며 예를 들어 "emp/login.do "URL"로 GET요청이 오면 "loing()" 메서드가 호출되고 POST요청이 오면 두번째 "login()" 메서드가 호출된다.
- "login(MemberDTO login UserInfo, HttpServletRequest request)" 매서드는 로그인 처리를 한다 사용자 정보가 담긴 "MemberDTO" 객체와 HttpServletRequest" 객체를 파라미터로 받는다 . 이 메서드는 사용자 정보를 서비스에 전달하여 로그인 처리를 하고, 로그인 성공시 세션에 사용자 정보를 저장하며,실패시 다시 로그인 페이지로 리다이렉트한다.
- "logout(HttpSession session)" 메서드는 로그아웃 처리를 한다 세션을 파라미터로 받아 세션을 무효화 ("invalidate()")하며 이는 세션에 저장된 모든 정보를 삭제하고 세션을 종료하는 작업이다.
- "ModelAndView" 객체는 컨트롤러에서 뷰로 데이터를 전달하고 어떤 뷰를 보여줄 것인지 결정하는 역활을 한다. "setViewName()" 메서드는 표시하 뷰의 이름을 설정하고 여기서는 "redirect:/index.do" 나 redirect:/emp/login.do와 같이 리다이렉트 방식을 사용하고 있다.
MemberDAO 코드 리뷰
package com.multi.erp.member;
import java.util.List;
public interface MemberDAO {
List<MemberDTO> getTreeEmpList(String deptno);
int insert(MemberDTO user);
List<MemberDTO> getMemberList();
int delete(String id);
MemberDTO read(String id);
List<MemberDTO> search(String column, String search,String pass);
int update(MemberDTO user);
MemberDTO login(MemberDTO loginUser);
boolean idCheck(String id);
MemberDTO findById(String id);
}
MemberDAO 인터페이스는 다음과 같은 메소드들을 정의하고 있습니다:
"getTreeEmpList(String deptno)" : 주어진 부서 번호(deptno)에 속한 직원들의 목록을 반환한다 반환 타입은 MemberDTO 객체의 리스트다
"insert(MemberDTO user)" : 주어진 MemberDTO 객체를 이용하여 새로운 멤버를 추가한다 삽입 성공 시 삽입된 레코드 수를 반환한다
"getMemberList()" : 모든 멤버들의 목록을 반환한다. 반환 타입은 MemberDTO 객체의 리스트다.
"delete(String id)" : 주어진 아이디(id)를 가진 멤버를 삭제한다. 삭제 성공 시 삭제된 레코드 수를 반환한다.
"read(String id)" : 주어진 아이디(id)를 가진 멤버의 정보를 반환한다 반환 타입은 MemberDTO 객체다.
"search(String column, String search, String pass)" : 주어진 칼럼명(column)과 검색어(search), 비밀번호(pass)를 이용하여 멤버들을 검색하고, 검색 결과를 반환한다 반환 타입은 MemberDTO 객체의 리스트다.
"update(MemberDTO user)" : 주어진 MemberDTO 객체를 이용하여 멤버의 정보를 업데이트한다 업데이트 성공 시 업데이트된 레코드 수를 반환한다.
"login(MemberDTO loginUser)" : 주어진 MemberDTO 객체를 이용하여 멤버의 로그인을 처리하고, 로그인 성공 시 해당 멤버의 정보를 반환한다. 반환 타입은 MemberDTO 객체이다.
"idCheck(String id)" : 주어진 아이디(id)를 가진 멤버가 있는지 확인하고, 있으면 true, 없으면 false를 반환한다.
"findById(String id)" : 주어진 아이디(id)를 가진 멤버의 정보를 반환한다. 반환 타입은 MemberDTO 객체다.
이 인터페이스는 데이터베이스와 연결하여 CRUD(Create, Read, Update, Delete)와 같은 기본적인 데이터 조작 연산, 로그인 처리, 아이디 중복 확인 등의 작업을 수행한다. 이런 작업들은 일반적으로 웹 어플리케이션에서 자주 수행되는 작업들이며 이 인터페이스를 구현하는 클래스는 이 메소드들을 구현하여 실제로 데이터를 처리하는 로직을 작성해야 한다.
MemberDAOImpl 코드 리뷰
package com.multi.erp.member;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class MemberDAOImpl implements MemberDAO {
//Mybatis의 핵심클래스를 이용해서 sql문을 실행
SqlSession sqlSessionTemplate;
public MemberDAOImpl() {
}
@Autowired
public MemberDAOImpl(SqlSession sqlSessionTemplate) {
super();
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public List<MemberDTO> getTreeEmpList(String deptno) {
// TODO Auto-generated method stub
return null;
}
@Override
public int insert(MemberDTO user) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<MemberDTO> getMemberList() {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(String id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public MemberDTO read(String id) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<MemberDTO> search(String column, String search, String pass) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(MemberDTO user) {
// TODO Auto-generated method stub
return 0;
}
@Override
public MemberDTO login(MemberDTO loginUser) {
// TODO Auto-generated method stub
return sqlSessionTemplate.selectOne("com.multi.erp.member.login", loginUser);
}
@Override
public boolean idCheck(String id) {
// TODO Auto-generated method stub
return false;
}
@Override
public MemberDTO findById(String id) {
// TODO Auto-generated method stub
return null;
}
}
MyBatis를 사용한 "MemberDAO" 인터페이스의 구현체인 "MemberDAOImpl" 클래스를 정의하고있다.
이 클래스는 "MemberDAO" 인터페이스에서 정의한 모든 메소드를 오버라이드(재정의) 하고있다.
각 메소드에는 해당하는 SQL퀴리를 실행하는 로직을 추가 할 수있다.
MyBatis의 "SqlSession"객체인 "sqlSessionTemplate"는 SQL 쿼리를 실행하는데 사용된다
이객체는 Spring이 "@Autowired" 어노테이션을 통해 자동으로 주입(inject)한다.
예를 들어 "login(MemberDAO loginUser)" 메소드는 "sqlSessionTemplate"의 "selectOne" 메소드를 사용하여
"com.mulit.erp.member.login" ID를 가진 SQL 쿼리를 실행하고 그 결과를 "MemberDTO" 객체로 반환합니다.
이 쿼리는 Mybatis 매퍼파일에 정의되어 있어야한다.
나머지 메소드들도 비슷한 패턴으로 구현하면 된다. 각 메소드에 해당하는 SQL 쿼리를 실행하고 그 결과를 적절한 형태로 반환하면 된다 이 때, selectOne, selectList, insert, update, delete 등의 SqlSession 메소드를 사용하게 됩니다.
MemberDAOImpl 코드 리뷰(설명생략)
package com.multi.erp.member;
import java.sql.Date;
import org.springframework.web.multipart.MultipartFile;
public class MemberDTO {
private String id;
private String pass;
private String name;
private String ssn;
private String birthday;
private String marry;
private String gender;
private String position;
private String duty;
private String classes;
private Date startday;
private Date endday;
private String deptno;
private String curstate;
private String zipcode;
private String addr;
private String detailaddr;
private String phonehome;
private String phoneco;
private String phonecell;
private String email;
private String profile_photo;
private String deptname; //로그인 사용자의 부서정보
private String menupath; //로그인 사용자의 메뉴페이지정보
private String job_category;//로그인 사용자의 job분류정보
//MultipartFile userImage;
public MemberDTO() {
System.out.println("기본생성자");
}
//로그인 파라미터 매핑용 생성자
//select용 생성자
public MemberDTO(String id, String pass, String name, String ssn, String birthday, String marry, String gender,
String position, String duty, String classes, Date startday, Date endday, String deptno, String curstate,
String zipcode, String addr, String detailaddr, String phonehome, String phoneco, String phonecell,
String email, String profile_photo) {
super();
System.out.println("전체 매개변수 생성자");
this.id = id;
this.pass = pass;
this.name = name;
this.ssn = ssn;
this.birthday = birthday;
this.marry = marry;
this.gender = gender;
this.position = position;
this.duty = duty;
this.classes = classes;
this.startday = startday;
this.endday = endday;
this.deptno = deptno;
this.curstate = curstate;
this.zipcode = zipcode;
this.addr = addr;
this.detailaddr = detailaddr;
this.phonehome = phonehome;
this.phoneco = phoneco;
this.phonecell = phonecell;
this.email = email;
this.profile_photo = profile_photo;
}
public MemberDTO(String id, String pass, String name, String ssn, String birthday, String marry, String gender,
String position, String duty, String classes, Date startday, Date endday, String deptno, String curstate,
String zipcode, String addr, String detailaddr, String phonehome, String phoneco, String phonecell,
String email, String profile_photo, String deptname, String menupath, String job_category) {
super();
this.id = id;
this.pass = pass;
this.name = name;
this.ssn = ssn;
this.birthday = birthday;
this.marry = marry;
this.gender = gender;
this.position = position;
this.duty = duty;
this.classes = classes;
this.startday = startday;
this.endday = endday;
this.deptno = deptno;
this.curstate = curstate;
this.zipcode = zipcode;
this.addr = addr;
this.detailaddr = detailaddr;
this.phonehome = phonehome;
this.phoneco = phoneco;
this.phonecell = phonecell;
this.email = email;
this.profile_photo = profile_photo;
this.deptname = deptname;
this.menupath = menupath;
this.job_category = job_category;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
public String getMenupath() {
return menupath;
}
public void setMenupath(String menupath) {
this.menupath = menupath;
}
public String getJob_category() {
return job_category;
}
public void setJob_category(String job_category) {
this.job_category = job_category;
}
public String getId() {
System.out.println("==============getId()=============");
return id;
}
public void setId(String id) {
System.out.println("==============setId()=============");
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getMarry() {
return marry;
}
public void setMarry(String marry) {
this.marry = marry;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public String getDuty() {
return duty;
}
public void setDuty(String duty) {
this.duty = duty;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
public Date getStartday() {
return startday;
}
public void setStartday(Date startday) {
this.startday = startday;
}
public Date getEndday() {
return endday;
}
public void setEndday(Date endday) {
this.endday = endday;
}
public String getDeptno() {
return deptno;
}
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public String getCurstate() {
return curstate;
}
public void setCurstate(String curstate) {
this.curstate = curstate;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getDetailaddr() {
return detailaddr;
}
public void setDetailaddr(String detailaddr) {
this.detailaddr = detailaddr;
}
public String getPhonehome() {
return phonehome;
}
public void setPhonehome(String phonehome) {
this.phonehome = phonehome;
}
public String getPhoneco() {
return phoneco;
}
public void setPhoneco(String phoneco) {
this.phoneco = phoneco;
}
public String getPhonecell() {
return phonecell;
}
public void setPhonecell(String phonecell) {
this.phonecell = phonecell;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProfile_photo() {
return profile_photo;
}
public void setProfile_photo(String profile_photo) {
this.profile_photo = profile_photo;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", pass=" + pass + ", name=" + name + ", ssn=" + ssn + ", birthday=" + birthday
+ ", marry=" + marry + ", gender=" + gender + ", position=" + position + ", duty=" + duty + ", classes="
+ classes + ", startday=" + startday + ", endday=" + endday + ", deptno=" + deptno + ", curstate="
+ curstate + ", zipcode=" + zipcode + ", addr=" + addr + ", detailaddr=" + detailaddr + ", phonehome="
+ phonehome + ", phoneco=" + phoneco + ", phonecell=" + phonecell + ", email=" + email
+ ", profile_photo=" + profile_photo +
", deptname=" + deptname +
", menupath=" + menupath
+ ", job_category=" + job_category + "]";
}
//생성자, setter, getter, toString 추가
}
MemberService코드 리뷰
package com.multi.erp.member;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
public interface MemberService {
List<MemberDTO> getTreeEmpList(String deptno);
int insert(MemberDTO user,MultipartFile file,String realpath,String filename);
public boolean idCheck(String id);
List<MemberDTO> getMemberList();
int delete(String id);
MemberDTO read(String id);
List<MemberDTO> search(String column, String search
,String pass);
int update(MemberDTO user);
MemberDTO login(MemberDTO loginUser);
}
"MemberService"라는 인터페이스를 정의하고 있다.
이 인터페이스는 회원 관련 서비스를 제공하는 메소드들을 정의하고 있다.
"getTreeEmpList(String deptno)" : 특정부서(deptno)에 속한 회원들의 리스트를 가져오는 메소드이다.
"insert(MemberDTO user, MultipartFile file, String realpath, String filename)" : 새로운 회원 정보를 데이터베이스에 삽입하는 메소드이다. 이때 회원정보는 "MemberDTO" 객체로, 업로드할 파일은 "multipartFile" 객체로 받는다 또한 파일의 실제경로와 파일 이름도 함께 받는다.
idCheck(String id): 특정 ID가 이미 사용 중인지 확인하는 메소드이다.
getMemberList(): 모든 회원의 리스트를 가져오는 메소드이다.
delete(String id): 특정 ID의 회원 정보를 삭제하는 메소드이다.
read(String id): 특정 ID의 회원 정보를 조회하는 메소드이다.
search(String column, String search, String pass): 주어진 칼럼(column)에서 특정 값(search)을 가진 회원을 검색하는 메소드이며 추가적으로 pass 값을 사용한다.
update(MemberDTO user): 회원 정보를 업데이트하는 메소드입니다. 업데이트할 회원 정보는 MemberDTO 객체로 받는다.
login(MemberDTO loginUser): 로그인을 처리하는 메소드입니다. 로그인 시도하는 사용자의 정보는 MemberDTO 객체로 받는다.
이 인터페이스는 서비스 레이어에 해당하며, 실제 로직은 이 인터페이스를 구현한 클래스에서 정의하게 된다 그 클래스는 이 인터페이스의 메소드를 오버라이드하여 각 메소드가 어떻게 동작해야 하는지를 구체화시킬 것이다.
MemberServiceImpl 코드 리뷰
package com.multi.erp.member;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.multi.erp.board.BoardDAO;
@Service
public class MemberServiceImpl implements MemberService {
MemberDAO dao;
public MemberServiceImpl() {
}
@Autowired
public MemberServiceImpl(MemberDAO dao) {
super();
this.dao = dao;
}
@Override
public List<MemberDTO> getTreeEmpList(String deptno) {
// TODO Auto-generated method stub
return null;
}
@Override
public int insert(MemberDTO user, MultipartFile file, String realpath, String filename) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean idCheck(String id) {
// TODO Auto-generated method stub
return false;
}
@Override
public List<MemberDTO> getMemberList() {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(String id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public MemberDTO read(String id) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<MemberDTO> search(String column, String search, String pass) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(MemberDTO user) {
// TODO Auto-generated method stub
return 0;
}
@Override
public MemberDTO login(MemberDTO loginUser) {
// TODO Auto-generated method stub
return dao.login(loginUser);
}
}
"MemberService" 인터페이스를 구현하는 "MemberServiceImpl" 클래스를 정의한다 .
이 클래스는 "@Service" 어노테이션으로 표시되어 있어 스프링에서 이 클래스의 인스턴스를 서비스 레이어의 구성 요소로 인식하고 관리한다.
그리고 "MemberDAO" 인터페이스를 사용하여 데이터베이스 연산을 수행한다 "MemberDAO" 인스턴스는 @Autowired" 어노테이션을 사용한 생성자 주입을 통해 제공된다.
"MemberServiceImpl" 클래스는 "MemberService" 인터페이스의 모든 메서드를 오버라이드 한다
대부분 구현 하지 않았다.
이 메서드들은 실제로는 데이터베이스 연산을 수행하기 위해 "MemberDAO" 인스턴스를 사용해야 한다.
단 "login(MemberDTO loginUser)" 메서드는 "dao.login(loginUser)"를 호출하여 실제로 로그인 처리를 수행한다.
이 메서드는 로그인 시도하는 사용자의 정보 ("loginUser") 를 받아 DAO를 통해 데이터베이스에서 사용자를 찾아 해당 사용자의 정보를 반환한다.
'코드리뷰' 카테고리의 다른 글
업로드 (0) | 2023.05.15 |
---|---|
MyBatis,Spring(com.multi.erp.board) (2) | 2023.05.13 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!