shjung 2 éve
szülő
commit
cab6cb6d12

+ 0 - 66
src/main/java/com/its/op/controller/its/database/TbMsWebMemberController.java

@@ -1,66 +0,0 @@
-package com.its.op.controller.its.database;
-
-import io.swagger.annotations.Api;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@Api(tags = "09.기초데이터관리-14.홈페이지관리자관리")
-@Validated
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/api/database/web-member")
-public class TbMsWebMemberController {
-//
-//    private final TbMsWebMemberService service;
-//
-//    @ApiOperation(value = "홈페이지관리자 전체조회(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class, responseContainer = "ArrayList")
-//    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
-//    public List<TbMsWebMemberDto> findAll() {
-//        return this.service.findAll();
-//    }
-//
-//    @ApiOperation(value = "홈페이지관리자 개별조회(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class)
-//    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-//    public TbMsWebMemberDto findById(@PathVariable final String id) {
-//        return this.service.findById(id);
-//    }
-//
-//    @ApiOperation(value = "홈페이지관리자 계정잠금 해제", response = TbMsWebMemberDto.class)
-//    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-//    public TbMsWebMemberDto accountLockFree(@PathVariable final String id) {
-//        return this.service.accountLockFree(id);
-//    }
-//
-////    @ApiOperation(value = " 정보변경(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class)
-////    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-////    public TbMsWebMemberDto updateById(@PathVariable final String id, @RequestBody @Valid final TbMsWebMemberDto.TbMsWebMemberUpdReq req) {
-////        return this.service.updateById(id, req);
-////    }
-//
-//    @ApiOperation(value = " 정보변경/생성-목록(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class, responseContainer = "ArrayList")
-//    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-//    public List<TbMsWebMemberDto> mergeInfoList(@RequestBody @Valid final List<TbMsWebMemberDto.TbMsWebMemberUpdReq> listReq) {
-//        return this.service.mergeInfoList(listReq);
-//    }
-//
-//    @ApiOperation(value = "홈페이지관리자 정보변경/생성-개별(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class)
-//    @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-//    public TbMsWebMemberDto mergeInfo(@PathVariable("id") String id, @RequestBody @Valid final TbMsWebMemberDto.TbMsWebMemberUpdReq req) {
-//        return this.service.mergeInfo(req);
-//    }
-//
-//    @ApiOperation(value = "홈페이지관리자 정보삭제-개별(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class)
-//    @DeleteMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-//    public TbMsWebMemberDto deleteDataById(@PathVariable("id") String id) {
-//        return this.service.deleteById(id);
-//    }
-//
-//    @ApiOperation(value = " 정보삭제-목록(TB_MS_WEB_MEMBER)", response = TbMsWebMemberDto.class, responseContainer = "ArrayList")
-//    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
-//    public List<TbMsWebMemberDto> deleteDataByIds(@RequestBody @Valid final List<String> ids) {
-//        return this.service.deleteByIds(ids);
-//    }
-
-}

+ 77 - 0
src/main/java/com/its/op/controller/its/database/TbWwwMemberController.java

@@ -0,0 +1,77 @@
+package com.its.op.controller.its.database;
+
+import com.its.op.dto.its.oper.TbWwwMemberDto;
+import com.its.op.service.its.oper.TbWwwMemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "09.기초데이터관리-14.홈페이지관리자관리")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/database/web-member")
+public class TbWwwMemberController {
+
+    private final TbWwwMemberService service;
+
+    @ApiOperation(value = "홈페이지관리자 전체조회(TB_WWW_MEMBER)", response = TbWwwMemberDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWwwMemberDto> findAll() {
+        return this.service.findAll();
+    }
+
+//    @ApiOperation(value = "홈페이지관리자 전체조회(TB_WWW_MEMBER)", response = TbWwwMemberDto.class, responseContainer = "ArrayList")
+//    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+//    public List<TbWwwMemberDto> findAllList() {
+//        return this.service.findAllList();
+//    }
+
+    @ApiOperation(value = "홈페이지관리자 개별조회(TB_WWW_MEMBER)", response = TbWwwMemberDto.class)
+    @GetMapping(value = "/{email}", produces = {"application/json; charset=utf8"})
+    public TbWwwMemberDto findById(@PathVariable("email") final String email) {
+        return this.service.findById(email);
+    }
+
+    @ApiOperation(value = "홈페이지관리자 계정잠금 해제", response = TbWwwMemberDto.class)
+    @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public TbWwwMemberDto accountLockFree(@PathVariable final String id) {
+        return this.service.accountLockFree(id);
+    }
+
+//    @ApiOperation(value = "홈페이지관리자 정보변경(TB_WWW_MEMBER)", response = TbWwwMemberDto.class)
+//    @PutMapping(value = "/{email}", produces = {"application/json; charset=utf8"})
+//    public TbWwwMemberDto updateById(@PathVariable("email") final String email, @RequestBody @Valid final TbWwwMemberDto.TbWwwMemberUpdReq req) {
+//        return this.service.updateById(email, req);
+//    }
+
+    @ApiOperation(value = "홈페이지관리자 정보변경/생성-목록(TB_WWW_MEMBER)", response = TbWwwMemberDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWwwMemberDto> mergeInfoList(@RequestBody @Valid final List<TbWwwMemberDto.TbWwwMemberUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "웹 사용자 정보 정보변경/생성-개별(TB_WWW_MEMBER)", response = TbWwwMemberDto.class)
+    @PostMapping(value = "/{email}", produces = {"application/json; charset=utf8"})
+    public TbWwwMemberDto mergeInfo(@PathVariable("email") final String email, @RequestBody @Valid final TbWwwMemberDto.TbWwwMemberUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "웹 사용자 정보 정보삭제-개별(TB_WWW_MEMBER)", response = TbWwwMemberDto.class)
+    @DeleteMapping(value = "/{email}", produces = {"application/json; charset=utf8"})
+    public TbWwwMemberDto deleteDataById(@PathVariable("email") final String email) {
+        return this.service.deleteById(email);
+    }
+
+    @ApiOperation(value = "웹 사용자 정보 정보삭제-목록(TB_WWW_MEMBER)", response = TbWwwMemberDto.class, responseContainer = "ArrayList")
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWwwMemberDto> deleteDataByIds(@RequestBody @Valid final List<String> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 20 - 0
src/main/java/com/its/op/dao/repository/its/oper/TbWwwMemberRepository.java

@@ -0,0 +1,20 @@
+package com.its.op.dao.repository.its.oper;
+
+import com.its.op.entity.its.oper.TbWwwMember;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbWwwMemberRepository extends JpaRepository<TbWwwMember, String>, JpaSpecificationExecutor<TbWwwMember> {
+
+    @Query("select p from TbWwwMember p")
+    List<TbWwwMember> findAll();
+
+    @Query("select p from TbWwwMember p where p.delYn = 'N'")
+    List<TbWwwMember> findAllList();
+
+}

+ 197 - 0
src/main/java/com/its/op/dto/its/oper/TbWwwMemberDto.java

@@ -0,0 +1,197 @@
+package com.its.op.dto.its.oper;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.oper.TbWwwMember;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 웹 사용자 정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbWwwMemberDto(웹 사용자 정보)")
+public class TbWwwMemberDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("이메일주소")  // N VARCHAR2(50)
+    @JsonProperty("email")
+    private String email;
+
+    @ApiModelProperty("이름")  // Y VARCHAR2(15)
+    @JsonProperty("name")
+    private String name;
+
+    @ApiModelProperty("비밀번호")  // Y VARCHAR2(100)
+    @JsonProperty("pwd")
+    private String pwd;
+
+    @ApiModelProperty("연락처")  // Y VARCHAR2(30)
+    @JsonProperty("contact_num")
+    private String contactNum;
+
+    @ApiModelProperty("권한등급")  // Y VARCHAR2(3)
+    @JsonProperty("user_auth")
+    private String userAuth;
+
+    @ApiModelProperty("비밀번호힌트질문('HNT')")  // Y VARCHAR2(7)
+    @JsonProperty("hint_ques")
+    private String hintQues;
+
+    @ApiModelProperty("비밀번호힌트질문답")  // Y VARCHAR2(100)
+    @JsonProperty("hint_ans")
+    private String hintAns;
+
+    @ApiModelProperty("로그인 실패 횟수")  // Y NUMBER(2)
+    @JsonProperty("login_fail_count")
+    private Integer loginFailCount;
+
+    @ApiModelProperty("계정잠금여부(Y:계정잠김)")  // Y CHAR(1)
+    @JsonProperty("is_account_lock")
+    private String isAccountLock;
+
+    @ApiModelProperty("관리자계정접속가능아이피(*:모두가능)")  // Y VARCHAR2(200)
+    @JsonProperty("ip_address")
+    private String ipAddress;
+
+    @ApiModelProperty("등록시각")  // Y VARCHAR2(14)
+    @JsonProperty("reg_dt")
+    private String regDt;
+
+    @ApiModelProperty("삭제여부(Y:삭제됨)")  // Y CHAR(1)
+    @JsonProperty("del_yn")
+    private String delYn;
+
+    // Code Description Field
+//    @ApiModelProperty("삭제여부(Y:삭제됨) 설명")
+//    @JsonProperty("del_desc")    // DEL_YN
+//    private String delDesc;
+
+    @ApiModel("TbWwwMemberUpdReq(웹 사용자 정보 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbWwwMemberUpdReq {
+
+        @ApiModelProperty("이메일주소, Nullable = N, VARCHAR2(50)")  // N VARCHAR2(50)
+        @JsonProperty("email")
+        @Size(min=1, max=50)
+        private String email;
+
+        @ApiModelProperty("이름, Nullable = Y, VARCHAR2(15)")  // Y VARCHAR2(15)
+        @JsonProperty("name")
+        @Size(min=1, max=15)
+        private String name;
+
+        @ApiModelProperty("비밀번호, Nullable = Y, VARCHAR2(100)")  // Y VARCHAR2(100)
+        @JsonProperty("pwd")
+        @Size(min=1, max=100)
+        private String pwd;
+
+        @ApiModelProperty("연락처, Nullable = Y, VARCHAR2(30)")  // Y VARCHAR2(30)
+        @JsonProperty("contact_num")
+        @Size(min=1, max=30)
+        private String contactNum;
+
+        @ApiModelProperty("권한등급, Nullable = Y, VARCHAR2(3)")  // Y VARCHAR2(3)
+        @JsonProperty("user_auth")
+        @Size(max=3)
+        private String userAuth;
+
+        @ApiModelProperty("비밀번호힌트질문('HNT'), Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
+        @JsonProperty("hint_ques")
+        @Size(max=7)
+        private String hintQues;
+
+        @ApiModelProperty("비밀번호힌트질문답, Nullable = Y, VARCHAR2(100)")  // Y VARCHAR2(100)
+        @JsonProperty("hint_ans")
+        @Size(max=100)
+        private String hintAns;
+
+        @ApiModelProperty("로그인 실패 횟수, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("login_fail_count")
+        @PositiveOrZero
+        private Integer loginFailCount;
+
+        @ApiModelProperty("계정잠금여부(Y:계정잠김), Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("is_account_lock")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String isAccountLock;
+
+        @ApiModelProperty("관리자계정접속가능아이피(*:모두가능), Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("ip_address")
+        @Size(max=200)
+        private String ipAddress;
+
+        @ApiModelProperty("등록시각, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("reg_dt")
+        @Size(max=14)
+        private String regDt;
+
+        @ApiModelProperty("삭제여부(Y:삭제됨), Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("del_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String delYn;
+
+        @Builder
+        public TbWwwMemberUpdReq(String email, String name, String pwd, String contact_num, String user_auth, String hint_ques, String hint_ans, Integer login_fail_count, String is_account_lock, String ip_address, String reg_dt, String del_yn) {
+            this.email = email;
+            this.name = name;
+            this.pwd = pwd;
+            this.contactNum = contact_num;
+            this.userAuth = user_auth;
+            this.hintQues = hint_ques;
+            this.hintAns = hint_ans;
+            this.loginFailCount = login_fail_count;
+            this.isAccountLock = is_account_lock;
+            this.ipAddress = ip_address;
+            this.regDt = reg_dt;
+            this.delYn = del_yn;
+        }
+        @ApiModel("TbWwwMemberLockFreeReq(홈페이지관리자정보 락 해제)")
+        @Getter
+        @Setter
+        @ToString
+        @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+        public static class TbWwwMemberLockFreeReq {
+
+            @ApiModelProperty("아이디, Nullable = N, VARCHAR(50)")  // N VARCHAR(50)
+            @JsonProperty("email")
+            @Size(min = 1, max = 50)
+            private String email;
+
+            @Builder
+            public TbWwwMemberLockFreeReq(String email) {
+                this.email = email;
+            }
+        }
+
+        public TbWwwMember toEntity() {
+            return TbWwwMember.builder()
+                    .email(this.email)
+                    .name(this.name)
+                    .pwd(this.pwd)
+                    .contactNum(this.contactNum)
+                    .userAuth(this.userAuth)
+                    .hintQues(this.hintQues)
+                    .hintAns(this.hintAns)
+                    .loginFailCount(this.loginFailCount)
+                    .isAccountLock(this.isAccountLock)
+                    .ipAddress(this.ipAddress)
+                    .regDt(this.regDt)
+                    .delYn(this.delYn)
+                    .build();
+        }
+
+    }
+
+}

+ 147 - 0
src/main/java/com/its/op/entity/its/oper/TbWwwMember.java

@@ -0,0 +1,147 @@
+package com.its.op.entity.its.oper;
+
+import com.its.op.dto.its.oper.TbWwwMemberDto;
+import com.its.utils.AES256Util;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * 웹 사용자 정보 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("웹 사용자 정보")
+@Entity
+@Table(name = "TB_WWW_MEMBER")
+public class TbWwwMember implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("이메일주소")  // N VARCHAR2(50)
+    @Id
+    @Column(name = "EMAIL", nullable = false, length = 50)
+    private String email;
+
+    @ApiModelProperty("이름")  // Y VARCHAR2(15)
+    @Column(name = "NAME", length = 15)
+    private String name;
+
+    @ApiModelProperty("비밀번호")  // Y VARCHAR2(100)
+    @Column(name = "PWD", length = 100)
+    private String pwd;
+
+    @ApiModelProperty("연락처")  // Y VARCHAR2(30)
+    @Column(name = "CONTACT_NUM", length = 30)
+    private String contactNum;
+
+    @ApiModelProperty("권한등급")  // Y VARCHAR2(3)
+    @Column(name = "USER_AUTH", length = 3)
+    private String userAuth;
+
+    @ApiModelProperty("비밀번호힌트질문('HNT')")  // Y VARCHAR2(7)
+    @Column(name = "HINT_QUES", length = 7)
+    private String hintQues;
+
+    @ApiModelProperty("비밀번호힌트질문답")  // Y VARCHAR2(100)
+    @Column(name = "HINT_ANS", length = 100)
+    private String hintAns;
+
+    @ApiModelProperty("로그인 실패 횟수")  // Y NUMBER(2)
+    @Column(name = "LOGIN_FAIL_COUNT", columnDefinition = "NUMBER", length = 2)
+    private Integer loginFailCount;
+
+    @ApiModelProperty("계정잠금여부(Y:계정잠김)")  // Y CHAR(1)
+    @Column(name = "IS_ACCOUNT_LOCK", columnDefinition = "CHAR", length = 1)
+    private String isAccountLock;
+
+    @ApiModelProperty("관리자계정접속가능아이피(*:모두가능)")  // Y VARCHAR2(200)
+    @Column(name = "IP_ADDRESS", length = 200)
+    private String ipAddress;
+
+    @ApiModelProperty("등록시각")  // Y VARCHAR2(14)
+    @Column(name = "REG_DT", length = 14)
+    private String regDt;
+
+    @ApiModelProperty("삭제여부(Y:삭제됨)")  // Y CHAR(1)
+    @Column(name = "DEL_YN", columnDefinition = "CHAR", length = 1)
+    private String delYn;
+
+    public String getPassword() {
+        return this.pwd;
+    }
+
+    public void setPassword(String password) {
+        if (!this.pwd.equals(password)) {
+            this.pwd = encodePassword(password);
+        }
+    }
+    public String encodePassword(String password) {
+        String encodePassword = "";
+        try {
+            AES256Util aes = new AES256Util(AES256Util.DEFAULT_KEY);
+            byte[] data = aes.aesEncode(this.pwd);
+            //encodePassword = new String(data);
+            encodePassword = new String(Base64.encodeBase64(data));
+        } catch (UnsupportedEncodingException e) {
+            encodePassword = this.pwd;
+        } catch (Exception e) {
+            encodePassword = this.pwd;
+        }
+        return encodePassword;
+    }
+
+    public void setAccountLockFree() {
+        this.loginFailCount = 0;
+        this.isAccountLock = "N";
+    }
+
+    public TbWwwMemberDto toDto() {
+        return TbWwwMemberDto.builder()
+                .email(this.email)
+                .name(this.name)
+                .pwd(this.pwd)
+                .contactNum(this.contactNum)
+                .userAuth(this.userAuth)
+                .hintQues(this.hintQues)
+                .hintAns(this.hintAns)
+                .loginFailCount(this.loginFailCount)
+                .isAccountLock(this.isAccountLock)
+                .ipAddress(this.ipAddress)
+                .regDt(this.regDt)
+                .delYn(this.delYn)
+                .build();
+    }
+
+    public TbWwwMember(String email) {
+        this.email = email;
+    }
+
+    public void updateInfo(TbWwwMemberDto.TbWwwMemberUpdReq req) {
+        this.name = req.getName();
+        this.pwd = req.getPwd();
+        setPassword(req.getPwd());
+        this.contactNum = req.getContactNum();
+        this.userAuth = req.getUserAuth();
+        this.hintQues = req.getHintQues();
+        this.hintAns = req.getHintAns();
+        this.loginFailCount = req.getLoginFailCount();
+        this.isAccountLock = req.getIsAccountLock();
+        this.ipAddress = req.getIpAddress();
+        this.regDt = req.getRegDt();
+        this.delYn = req.getDelYn();
+    }
+
+}

+ 127 - 0
src/main/java/com/its/op/service/its/oper/TbWwwMemberService.java

@@ -0,0 +1,127 @@
+package com.its.op.service.its.oper;
+
+import com.its.op.dao.repository.its.oper.TbWwwMemberRepository;
+import com.its.op.dto.its.oper.TbWwwMemberDto;
+import com.its.op.entity.its.oper.TbWwwMember;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbWwwMemberService {
+
+    private final TbWwwMemberRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbWwwMember requireOne(String email) throws NoSuchElementException {
+        Optional<TbWwwMember> info = this.repo.findById(email);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + email);
+        }
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWwwMemberDto> findAll() {
+        List<TbWwwMemberDto> result = new ArrayList<>();
+        List<TbWwwMember> data = this.repo.findAll();
+        for (TbWwwMember entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWwwMemberDto> findAllList() {
+        List<TbWwwMemberDto> result = new ArrayList<>();
+        List<TbWwwMember> data = this.repo.findAllList();
+        for (TbWwwMember entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbWwwMemberDto findById(String email) {
+        TbWwwMember entity = requireOne(email);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbWwwMemberDto updateById(String email, TbWwwMemberDto.TbWwwMemberUpdReq req) {
+        TbWwwMember entity = requireOne(email);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbWwwMemberDto> mergeInfoList(List<TbWwwMemberDto.TbWwwMemberUpdReq> reqList) {
+        List<TbWwwMemberDto> result = new ArrayList<>();
+        for (TbWwwMemberDto.TbWwwMemberUpdReq req : reqList) {
+            result.add(mergeInfo(req));
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbWwwMemberDto mergeInfo(TbWwwMemberDto.TbWwwMemberUpdReq req) {
+        TbWwwMember obj = req.toEntity();
+        try {
+            TbWwwMember entity = requireOne(req.getEmail());
+            obj.setPassword(entity.getPassword());
+        }
+        catch(NoSuchElementException e_notfound) {
+            obj.setPassword("");
+        }
+
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbWwwMemberDto deleteById(String email) {
+        TbWwwMember entity = requireOne(email);
+        this.repo.deleteById(email);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbWwwMemberDto> deleteByIds(List<String> ids) {
+        List<TbWwwMemberDto> result = new ArrayList<>();
+        for (String id : ids) {
+            Optional<TbWwwMember> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+    @Transactional
+    public TbWwwMemberDto accountLockFree(String id) {
+        TbWwwMember obj = requireOne(id);
+        obj.setAccountLockFree();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+}