Spring Boot를 이용하여 Login까지 간단히 끝냄. Maven버전이 아닌 Gradle 버전으로 남김

1. 새로운 프로젝트 생성
   - Type : Gradle 로 선택(필수)

2. Next 버튼 누른 후 Dependency 설정
   - 이전에 사용했던 항목이 있으면 Frequently Used 로 바로 보임. 체크를 하면 됨
   - 없으면 왼쪽 하단 부분에서 찾아(세모 클릭하면 펼쳐짐) 체크
   - 선택된 dependencies는 오른쪽 하단에 Selected 로 표시 됨

 

3.프로젝트 구조
   - 파일 위치 및 파일명 참조

4. Build.gradle 확인
   - dependencies 에서 implementation은 선택한 항목-
   - commons-beanutils 를 추가함.

-- jquery, bootstrap 추가

https://www.webjars.org/ 에서 해당 버전에 맞게 찾아옴
   - Build Tool 에서 해당 Tool 선택
   - 사용할 jar 의 추가방법 복사 : compile 'org.webjars:jquery:3.4.1'

-- 추가한 build.gradle

5. DB 연결 : src/main/resources 아래에 application.properties
   - server 포트 변경할 때 사용. 기본값은 8080이므로 변경할 때만 추가
   - mysql 설정에 localhost:3306 뒤에 연결할 db명을 적고 username, password
   - JPA를 사용하므로 hibernate.dll-auto=create 으로 추가

6. db script
  - mysql 을 사용하는 경우 id column에 PK, Auto_increment 속성을 넣는다.
  - oracle을 사용하는 경우에는 auto_increment 는 필요없다(별도의 sequence 사용)

   - key 정보를 잘못 설정한 경우 : table 생성 후 auto_increment 를 추가하려고 하면 foreign key가 있다고 오류남
     Key 삭제 후 다시 만들어야 함. table drop 이후에는... 애매해 짐

# unique key 삭제 및 생성
drop index 유니크키명 on 테이블명;
create unique index  유니크키명 on 테이블명 (컬럼명, 컬럼명);


# type이 innodb일 경우에는 unique key 삭제 하기전에 foreign key를 삭제해야 한다.
alter table 테이블명 drop foreign key 포린키명;
drop index 유니크키명 on 테이블명;


# innodb 타입 foreing key 재생성
alter table 테이블명 add CONSTRAINT 포린키명  foreign key (컬럼명) references 디비명 (컬럼명) on delete cascade;7. 미리보기
   - build.gradle에서 bootstrap, jquery를 추가하지 않은 경우
   - 개발자 모드로 확인시 script 오류가 확인 됨.

   - 추가 후

 

source

- UserRegistrationDto : package com.nobang.sample.web.dto

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;

import com.nobang.sample.constraint.FieldMatch;



@FieldMatch.List({
    @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"),
    @FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")
})
public class UserRegistrationDto {

    @NotEmpty
    private String firstName;

    @NotEmpty
    private String lastName;

    @NotEmpty
    private String password;

    @NotEmpty
    private String confirmPassword;

    @Email
    @NotEmpty
    private String email;

    @Email
    @NotEmpty
    private String confirmEmail;

    @AssertTrue
    private Boolean terms;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        this.confirmPassword = confirmPassword;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getConfirmEmail() {
        return confirmEmail;
    }

    public void setConfirmEmail(String confirmEmail) {
        this.confirmEmail = confirmEmail;
    }

    public Boolean getTerms() {
        return terms;
    }

    public void setTerms(Boolean terms) {
        this.terms = terms;
    }
}

 

- SampleUser : package com.nobang.sample.model

import javax.persistence.*;
import java.util.Collection;

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class SampleUser {

    @Id
//    @GeneratedValue(strategy = GenerationType.AUTO) // ORACLE
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;
    private String lastName;
    private String email;
    private String password;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
        name = "sample_users_roles",
        joinColumns = @JoinColumn(
            name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(
            name = "role_id", referencedColumnName = "id"))
    private Collection < SampleRole > roles;

    public SampleUser() {}

    public SampleUser(String firstName, String lastName, String email, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public SampleUser(String firstName, String lastName, String email, String password, Collection < SampleRole > roles) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.roles = roles;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Collection < SampleRole > getRoles() {
        return roles;
    }

    public void setRoles(Collection < SampleRole > roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {
        return "User{" +
            "id=" + id +
            ", firstName='" + firstName + '\'' +
            ", lastName='" + lastName + '\'' +
            ", email='" + email + '\'' +
            ", password='" + "*********" + '\'' +
            ", roles=" + roles +
            '}';
    }
}

 

- SampleRole : package com.nobang.sample.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class SampleRole {

    @Id
//    @GeneratedValue(strategy = GenerationType.AUTO) // ORACLE
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    public SampleRole() {}

    public SampleRole(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Role{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
    }
}

 

- UserRepository : package com.nobang.sample.repository;

@Repository
public interface UserRepository extends JpaRepository < SampleUser, Long > {
    SampleUser findByEmail(String email);
}

참고 : JPA에서 기본으로 제공하는 method

- FieldMatch : package com.nobang.sample.constraint;

import javax.validation.Payload;
import javax.validation.Constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({
    TYPE,
    ANNOTATION_TYPE
})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch {
//    String message() default "{constraints.field-match}";
//    Class << ? > [] groups() default {};
//    Class << ? extends Payload > [] payload() default {};
    
    String message() default "{constraints.fieldmatch}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};    
    
    String first();
    String second();

    @Target({
        TYPE,
        ANNOTATION_TYPE
    })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        FieldMatch[] value();
    }
}

 

- FieldMatchValidator : package com.nobang.sample.constraint;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.apache.commons.beanutils.BeanUtils;

public class FieldMatchValidator implements ConstraintValidator < FieldMatch, Object > {

    private String firstFieldName;
    private String secondFieldName;

    @Override
    public void initialize(final FieldMatch constraintAnnotation) {
        firstFieldName = constraintAnnotation.first();
        secondFieldName = constraintAnnotation.second();
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        try {
            final Object firstObj = BeanUtils.getProperty(value, firstFieldName);
            final Object secondObj = BeanUtils.getProperty(value, secondFieldName);
            return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
        } catch (final Exception ignore) {}
        return true;
    }
}

 

- UserService : package com.nobang.sample.service;

import org.springframework.security.core.userdetails.UserDetailsService;

import com.nobang.sample.model.SampleUser;
import com.nobang.sample.web.dto.UserRegistrationDto;


public interface UserService extends UserDetailsService {

    SampleUser findByEmail(String email);

    SampleUser save(UserRegistrationDto registration);
}

- UserServiceImpl : package com.nobang.sample.service;

import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import com.nobang.sample.model.SampleRole;
import com.nobang.sample.model.SampleUser;
import com.nobang.sample.repository.UserRepository;
import com.nobang.sample.web.dto.UserRegistrationDto;



@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    public SampleUser findByEmail(String email) {
        return userRepository.findByEmail(email);
    }

    public SampleUser save(UserRegistrationDto registration) {
        SampleUser user = new SampleUser();
        user.setFirstName(registration.getFirstName());
        user.setLastName(registration.getLastName());
        user.setEmail(registration.getEmail());
        user.setPassword(passwordEncoder.encode(registration.getPassword()));
        user.setRoles(Arrays.asList(new SampleRole("ROLE_USER")));
        return userRepository.save(user);
    }

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        SampleUser user = userRepository.findByEmail(email);
        if (user == null) {
            throw new UsernameNotFoundException("Invalid username or password.");
        }
        return new org.springframework.security.core.userdetails.User(user.getEmail(),
            user.getPassword(),
            mapRolesToAuthorities(user.getRoles()));
    }

//    private Collection << ? extends GrantedAuthority > mapRolesToAuthorities(Collection < Role > roles) {
//        return roles.stream()
//            .map(role - > new SimpleGrantedAuthority(role.getName()))
//            .collect(Collectors.toList());
//    }
    
    private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection roles){
        return roles.stream()
                .map(role -> new SimpleGrantedAuthority(role.getName()))
                .collect(Collectors.toList());
    }
}

 

- SecurityConfiguration : package com.nobang.sample.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import com.nobang.sample.service.UserService;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers(
                "/registration**",
                "/js/**",
                "/css/**",
                "/img/**",
                "/webjars/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .invalidateHttpSession(true)
            .clearAuthentication(true)
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/login?logout")
            .permitAll();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
        auth.setUserDetailsService(userService);
        auth.setPasswordEncoder(passwordEncoder());
        return auth;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
}

 

- MainController : package com.nobang.sample.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {

    @GetMapping("/")
    public String root() {
        return "index";
    }

    @GetMapping("/login")
    public String login(Model model) {
        return "login";
    }

    @GetMapping("/user")
    public String userIndex() {
        return "user/index";
    }
}

 

- UserRegistrationController :

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.nobang.sample.model.SampleUser;
import com.nobang.sample.service.UserService;
import com.nobang.sample.web.dto.UserRegistrationDto;



@Controller
@RequestMapping("/registration")
public class UserRegistrationController {

    @Autowired
    private UserService userService;

    @ModelAttribute("user")
    public UserRegistrationDto userRegistrationDto() {
        return new UserRegistrationDto();
    }

    @GetMapping
    public String showRegistrationForm(Model model) {
        return "registration";
    }

    @PostMapping
    public String registerUserAccount(@ModelAttribute("user") @Valid UserRegistrationDto userDto,
        BindingResult result) {

        SampleUser existing = userService.findByEmail(userDto.getEmail());
        if (existing != null) {
            result.rejectValue("email", null, "There is already an account registered with that email");
        }

        if (result.hasErrors()) {
            return "registration";
        }

        userService.save(userDto);
        return "redirect:/registration?success";
    }
}

 

참조 : https://www.javaguides.net/2019/02/spring-mvc-5-spring-security-5-hibernate-5-mysql.html

728x90

전자정부 프레임워크는 기본으로 회원전용 서비스이다.

로그인을 해야만 사용할 수 있는데 blog처럼 누구나 와서 읽을 수 있는 서비스를 하려고 하면 좀 복잡하다.


간단하게 *.do 형태로 호출되는 서비스와

*.bog 로 호출되는 서비스를 나누어서 *.blog에서는 로그인 체크를 안하면 된다.


추가방법.

web.xml 에 추가 : 기존에 action 이라는 servlet이 있으므로 그 밑에 추가

    <servlet>
        <servlet-name>blog</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/blog/springmvc/blog*.xml</param-value>
        </init-param>
        /
    </servlet>
    <servlet-mapping>
        <servlet-name>blog</servlet-name>
        <url-pattern>*.blog</url-pattern>
    </servlet-mapping>  


blog_servlet.xml 추가 : web.xml 에 정의된 경로에 추가


이것은 egov-com-servlet.xml 을 copy 한 것이고

기본 package 경로를 수정한다.

    <context:component-scan base-package="사용할package명.blog">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan> 

Java Source로 Controller, Service, Repository 등을 생성한다.

(일단은 Contoller만 만들어서 되는지 확인하자)

@Controller
public class BlogController {


    private ApplicationContext applicationContext;

    private static final Logger LOGGER = LoggerFactory.getLogger(BlogController.class);

    private Map<Integer, IncludedCompInfoVO> map;

    public void afterPropertiesSet() throws Exception {}

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
       
        LOGGER.info("BlogController setApplicationContext method has called!");
    }

    @RequestMapping("/index.blog")
    public String index(ModelMap model) {
        return "blog/BlogMain";
    }
 


index.blog 가 호출될 때 보여줄 jsp Page를 만든다

WEB-INF/jsp/blog/BlogMain.jsp

WEB-INF 밑에 index.jsp 에서

<jsp:forward page="/index.do"/> 를 호출하게 되어 있으므로

<jsp:forward page="/index.blog"/>로 바꾸어 준다.


728x90

전자정부 프레임워크로 프로젝트를 만들 때

1. 빈 프로젝트 에서 공통 컴포넌트들을 추가한다.

2. Template 프로젝트를 생성한 후 필요한 공통컴포넌트를 추가한다.

3. AllinOne 프로젝트를 생성한다.


2번의 경우에서 필요한 컴포넌트 추가하면 에러가 많이난다.

이유는 컴포넌트에 동일한 서비스가 이미 있는 경우가 있기 떄문이다.

RestdeManageService를 예로 들면

egovframework.com.sym.cal.service.impl/EgovCalRestdeManageServiceImpl

egovframework.let.sym.cal.service.impl/EgovCalRestdeManageServiceImpl

두개 파일이 동일한 @RestdeManageService 로 정의되어 있다.


그러면 어떤 것을 사용해야할 지 고민이 된다.

원본에는 let안에 있는데... com으로 바꿔야하나

아무튼 이런것들이 꽤 많다.

전자정부프레임워크 담당자는 빈 Web 프로젝트부터 시작하라고 한다.

http://www.egovframe.go.kr/uss/olh/qna/QnaInqireCoUpdt.do?qaId=QA_00000000000013099&passwordConfirmAt=


그래도 템플릿에서 시작하겠다고 하면

중복되는 애들의 @Controller, @Service, @Repository 를 하나를 없애고

참조하는 import 경로도 수정한다.


let가 기본인데 com으로 바꿀 때 import 를 수정하지 않으면 casting에러가 난다.

728x90

index 화면이 열리기까지의 과정이다.


1. globals.properties에 main page 경로 정의

(/egov_portal_shop/src/main/resources/egovframework/egovProps/globals.properties)

Globals.MainPage = /cmm/main/mainPage.do


2. controller 에서 정의

requestMapping의 value 에 Globals.MainPage 값을 넣어 준다.

각종 조회한 뒤 addAttribute로 넣은뒤

jsp로 넘긴다.("main/EgovMainView")

    @RequestMapping(value = "/cmm/main/mainPage.do")
    public String getMgtMainPage(HttpServletRequest request, ModelMap model)
      throws Exception{

        // 공지사항 메인 컨텐츠 조회 시작 ---------------------------------
        //model.addAttribute("notiList", map.get("resultList"));
        // 공지사항 메인컨텐츠 조회 끝 -----------------------------------

        // 자유게시판 메인 컨텐츠 조회 시작 ---------------------------------
        model.addAttribute("bbsList", bbsMngService.selectBoardArticles(boardVO, "BBSA02").get("resultList"));
        // 자유게시판 메인컨텐츠 조회 끝 -----------------------------------

        // FAQ 메인 컨텐츠 조회 시작 ---------------------------------
        //model.addAttribute("faqList", faqManageService.selectFaqList(searchVO));
        // FAQ 메인 컨텐츠 조회 끝 -----------------------------------

        // 설문참여 메인 컨텐츠 조회 시작 -----------------------------------
        //model.addAttribute("qriList", egovQustnrRespondInfoService.selectQustnrRespondInfoManageList(qVO));
     // 설문참여 메인 컨텐츠 조회 끝 -----------------------------------


        return "main/EgovMainView";
    }


3. jsp page

jsp Page에 대한 처리 정보는 servlet.xml 에서 한다

(/egov_portal_shop/src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml)

    <!-- 화면처리용 JSP 파일명의  prefix, suffix 처리에 대한 mvc 설정  -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
    p:viewClass="org.springframework.web.servlet.view.JstlView"
    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> 

기본으로 /WEB-INF/jsp/ 에 .jsp 파일을 설정해놨다


return "main/EgovMainView" 를 하게 되면

/WEB-INF/jsp/main/EgovMainView.jsp 파일을 찾는다.

(/egov_portal_shop/src/main/webapp/WEB-INF/jsp/main/EgovMainView.jsp)


하지만 이렇게 하면

호출되는 주소창에 다음과 같이 나온다.

http://localhost:8080/egov_portal/cmm/main/mainPage.do


깔끔하게 루트로 보내려면

다음과 같은 작업을 한다.

나만의 서비스이므로 package를 새로만든다. robsoft

하지만 spring에서 component-scan에 의해 정해진 package만 사용되므로

base-package인 egovframework를 붙인다.

(/egov_portal_shop/src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml)

    <!-- 패키지 내 Controller, Service, Repository 클래스의 auto detect를 위한 mvc 설정 -->
    <context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>


그래서 egovframework.rob.shop (shop은 내가 만들 모듈 명)으로 하고 controller class를 만든다.

egovframework.rob.shop.RobMainController


여기에 mainPage로 보낼 코드를 작성한다.

소스는 원래 있던 소스를 그대로 가져왔다.

    /**
     * 메인 페이지 조회
     * @return 메인페이지 정보 Map [key : 항목명]
     *
     * @param request
     * @param model
     * @exception Exception Exception
     */
    @RequestMapping(value = "/mainPage.do")
    public String getMgtMainPage(HttpServletRequest request, ModelMap model)
      throws Exception{

        // 공지사항 메인 컨텐츠 조회 시작 ---------------------------------
        model.addAttribute("notiList", map.get("resultList"));


        // 공지사항 메인컨텐츠 조회 끝 -----------------------------------

        // 자유게시판 메인 컨텐츠 조회 시작 ---------------------------------
        model.addAttribute("bbsList", bbsMngService.selectBoardArticles(boardVO, "BBSA02").get("resultList"));
        // 자유게시판 메인컨텐츠 조회 끝 -----------------------------------

        // FAQ 메인 컨텐츠 조회 시작 ---------------------------------
        model.addAttribute("faqList", faqManageService.selectFaqList(searchVO));
        // FAQ 메인 컨텐츠 조회 끝 -----------------------------------

        // 설문참여 메인 컨텐츠 조회 시작 -----------------------------------
        model.addAttribute("qriList", egovQustnrRespondInfoService.selectQustnrRespondInfoManageList(qVO));
     // 설문참여 메인 컨텐츠 조회 끝 -----------------------------------


        return "main/RobMainView";
    }
 


그 다음 jsp Page

prefix로 /WEB-INF/jsp 가 붙으므로 경로는 다음과 같다.

파일명에도 뒤에 .jsp가 붙는다.

/egov_portal/src/main/webapp/WEB-INF/jsp/main/RobMainView.jsp 

마찬가지로 내용은 원본인 EgovMainView.jsp와 동일하게 했다.


그리고 호출할 때 index.jap파일도 수정해야 한다.

/egov_portal_shop/src/main/webapp/index.jsp

기본으로 index.jsp를 찾게 되고 거기에서 mainPage.do로 forwarding을 한다.

/cmm/main/mainPage.do를 그냥 mainPage.do 로 바꾼다.

원본 : <script type="text/javaScript">document.location.href="<c:url value='/cmm/main/mainPage.do'/>"</script>

수정본 : <script type="text/javaScript">document.location.href="<c:url value='/mainPage.do'/>"</script>


이러면 바로

http://localhost:8080/egov_portal/ 을 하면 바로 mainPage.do로 보인다.

728x90

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)


[net.sf.log4jdbc.DriverSpy] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.


여러 원인이 있다.

1. tomcat의 실제 lib 결로에 mysql jar 파일을 넣으라고도 하고

2. 여러 프로젝트로 인해 꼬였으니 clean 후 다시 배포하라고도 하는데


나의 경우에는 2번인 듯 하다.

똑같은 Project 소스를 이름만 다르게 했는데..

하나를 close project 한뒤에

clean 하고 다시 배포했더니 된다. ㅡ.ㅡ


728x90

전자정부 프레임워크 All in one 에서

web_allinone.xml 을 수정했는데

갑자기 에러가 난다.

cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element-only.    web_allinone.xml    /allinone/src/main/webapp/WEB-INF    line 5    XML Problem


저 부분은 건드린 것이 없는데...

<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 


1개의 element만 사용할 수 있다고 하는데

자세히 보면 xsi:schemaLocation에 두 개가 정의되어 있다.

그중에 xmlns:web에 똑같은 내용이 있어서

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd를 제거하니 오류가 없어진다.

<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"> 



728x90

첫 화면은 index.do 이다.

첫화면을 변경하기 위해서는 index.do 를 adminIndex.do 로 변경한 뒤에

index.do를 만들어 원하는 디자인을 입히면 될 것 같음.


--> 안된다 ㅜ.ㅜ

index.do를 다시 만들었는데... 자꾸 intercepter인가가 가로채서...

원래는 로그인 없이 사용할 수 있는 서비스로 보내려고 한건데.. 쩝.

일단 아래는 참고용으로 놔둠.

-----



EgovComIndexController.java

 @RequestMapping("/index.do")
    public String index(ModelMap model) {
        return "egovframework/com/cmm/EgovUnitMain";
    }

 EgovLoginSesionCheck.jsp

 <%
     // 세션 정보를 가져온다. LoginVO
     egovframework.com.cmm.LoginVO user = (egovframework.com.cmm.LoginVO)egovframework.com.cmm.util.EgovUserDetailsHelper.getAuthenticatedUser();
     String contextPath = request.getContextPath();
     if(user.getUrl() == null || user.getUrl().equals("")) user.setUrl(contextPath+"/index.do");
 %>

 egovDevIndex.jsp

 <jsp:forward page="/index.do"/>

 index.jsp

 <jsp:forward page="/index.do"/>

 

 


여기에서 일단 관리자는 adminIndex.do로 변경하면

1. adminIndex.jsp 생성(index.jsp 복사)

    index.do 를 adminIndex.do 로 변경


2. EgovLoginSesionCheck는 세션이 없으면 기본으로 index.do 로 보내는 것이므로 그대로 둠.


3. EgovComIndexController 에는 adminIndex 추가

   @RequestMapping("/adminIndex.do")
    public String adminIndex(ModelMap model) {
        return "egovframework/com/cmm/EgovUnitMain";
    }


728x90

뉴스관리라는 것이 있음.

근데 공지사항이랑 다른 용도겠지?

게시판이랑은 뭐가 다른건가...



조회

SELECT NEWS_ID, NEWS_SJ, NEWS_CN, NEWS_ORIGIN, NTCE_DE, ATCH_FILE_ID, FRST_REGIST_PNTTM, FRST_REGISTER_ID,
LAST_UPDT_PNTTM LAST_UPDUSR_PNTTM, LAST_UPDUSR_ID FROM COMTNNEWSINFO WHERE 1=1 ORDER BY NEWS_ID
DESC LIMIT 10 OFFSET 0


저장버튼 눌렀을 때

INSERT INTO COMTNNEWSINFO (NEWS_ID , NEWS_SJ , NEWS_CN , NEWS_ORIGIN , NTCE_DE , ATCH_FILE_ID
, FRST_REGIST_PNTTM , FRST_REGISTER_ID , LAST_UPDT_PNTTM , LAST_UPDUSR_ID) VALUES ( 'NEWS_000000000000001'
, '첫번째 뉴스' , '첫번째 뉴스입니다.' , 'http://nobang.tistory.com' , '20181012' , NULL , sysdate() , 'USRCNFRM_00000000000'
, sysdate() , 'USRCNFRM_00000000000' )


내용보기

SELECT NEWS_ID, NEWS_SJ, NEWS_CN, NEWS_ORIGIN, NTCE_DE, ATCH_FILE_ID , DATE_FORMAT(FRST_REGIST_PNTTM,'%Y-%m-%d')
FRST_REGIST_PNTTM , FRST_REGISTER_ID, DATE_FORMAT(LAST_UPDT_PNTTM,'%Y-%m-%d') LAST_UPDT_PNTTM
, LAST_UPDUSR_ID FROM COMTNNEWSINFO WHERE NEWS_ID='NEWS_000000000000001'

728x90

행정용어 사전이라는게 있어서

단어장을 만들 수 있다.


이것을 활용하면 단어장 만들기 쉽겠다. ㅋ


단어 목록조회

SELECT A.ADMINIST_WORD_ID, A.ADMINIST_WORD_NM, A.ADMINIST_WORD_ENG_NM, A.ADMINIST_WORD_ABRV_NM
ADMINIST_WORD_ABRV, A.THEMA_RELM, A.WORD_SE WORD_DOMN, A.RELATE_STD_WORD, A.ADMINIST_WORD_DFN,
A.ADMINIST_WORD_DC, A.FRST_REGISTER_ID, DATE_FORMAT(A.FRST_REGIST_PNTTM,'%Y-%m-%d') FRST_REGISTER_PNTTM,
(SELECT USER_NM FROM COMTNEMPLYRINFO WHERE ESNTL_ID = A.FRST_REGISTER_ID) FRST_REGISTER_NM
FROM COMTNADMINISTRATIONWORD A WHERE 1=1 ORDER BY A.FRST_REGIST_PNTTM DESC LIMIT 10 OFFSET
0


등록버튼 눌렀을 때

SELECT A.CNTC_ID, A.TEST_CLASS_NM, A.MNGR_NM, A.MNGR_EMAIL_ADRES, A.MNTRNG_STTUS, DATE_FORMAT(A.LAST_UPDT_PNTTM,
'%Y-%m-%d %H:%i:%S') AS LAST_UPDT_PNTTM, A.LAST_UPDUSR_ID, A.FRST_REGISTER_ID, DATE_FORMAT(A.FRST_REGIST_PNTTM,
'%Y-%m-%d %H:%i:%S') AS FRST_REGIST_PNTTM, DATE_FORMAT(A.CREAT_DT, '%Y-%m-%d %H:%i:%S') AS
CREAT_DT, B.CODE_NM MNTRNG_STTUS_NM, C.CNTC_NM, D.INSTT_NM PROVD_INSTT_NM, E.SYS_NM PROVD_SYS_NM,
F.SVC_NM PROVD_SVC_NM, G.INSTT_NM REQUST_INSTT_NM, H.SYS_NM REQUST_SYS_NM FROM COMTNTRSMRCVMNTRNG
A, COMTCCMMNDETAILCODE B, COMTNSYSTEMCNTC C, COMTNCNTCINSTT D, COMTNCNTCSYSTEM E, COMTNCNTCSERVICE
F, COMTNCNTCINSTT G, COMTNCNTCSYSTEM H WHERE B.CODE_ID = 'COM046' AND A.MNTRNG_STTUS = B.CODE
AND A.CNTC_ID = C.CNTC_ID AND D.INSTT_ID = C.PROVD_INSTT_ID AND E.INSTT_ID = C.PROVD_INSTT_ID
AND E.SYS_ID = C.PROVD_SYS_ID AND F.INSTT_ID = C.PROVD_INSTT_ID AND F.SYS_ID = C.PROVD_SYS_ID
AND F.SVC_ID = C.PROVD_SVC_ID AND G.INSTT_ID = C.REQUST_INSTT_ID AND H.INSTT_ID = C.REQUST_INSTT_ID
AND H.SYS_ID = C.REQUST_SYS_ID AND A.CNTC_ID = C.CNTC_ID ORDER BY A.CNTC_ID ASC LIMIT 10000
OFFSET 0


저장 버튼 눌렀을 때


[IDGeneration Service] key_table에 대한 10 ID의 새로운 블록을 할당 ADMINIST_WORD_ID.

SELECT next_id FROM COMTECOPSEQ WHERE table_name = ?
2018-09-30 12:51:08,783  INFO [jdbc.sqltiming] SELECT next_id FROM COMTECOPSEQ WHERE table_name = 'ADMINIST_WORD_ID'


UPDATE COMTECOPSEQ SET next_id = 11 WHERE table_name = 'ADMINIST_WORD_ID'


INSERT INTO COMTNADMINISTRATIONWORD ( ADMINIST_WORD_ID, ADMINIST_WORD_NM, ADMINIST_WORD_ENG_NM,
ADMINIST_WORD_ABRV_NM, THEMA_RELM, WORD_SE, RELATE_STD_WORD, ADMINIST_WORD_DFN, ADMINIST_WORD_DC,
FRST_REGIST_PNTTM, FRST_REGISTER_ID, LAST_UPDT_PNTTM, LAST_UPDUSR_ID )VALUES( 'ADMINIST_00000000001',
'사무실', 'Office', 'office', '장소', '1', '사무실', '행정전문용어정의', '행정전문용어설명', sysdate(), 'USRCNFRM_00000000000',
sysdate(), 'USRCNFRM_00000000000' )


-- 목록조회


SELECT A.ADMINIST_WORD_ID, A.ADMINIST_WORD_NM, A.ADMINIST_WORD_ENG_NM, A.ADMINIST_WORD_ABRV_NM
ADMINIST_WORD_ABRV, A.THEMA_RELM, A.WORD_SE WORD_DOMN, A.RELATE_STD_WORD, A.ADMINIST_WORD_DFN,
A.ADMINIST_WORD_DC, A.FRST_REGISTER_ID, DATE_FORMAT(A.FRST_REGIST_PNTTM,'%Y-%m-%d') FRST_REGISTER_PNTTM,
(SELECT USER_NM FROM COMTNEMPLYRINFO WHERE ESNTL_ID = A.FRST_REGISTER_ID) FRST_REGISTER_NM
FROM COMTNADMINISTRATIONWORD A WHERE 1=1 ORDER BY A.FRST_REGIST_PNTTM DESC LIMIT 10 OFFSET
0

728x90

게시판을 추가해 보자


http://localhost:8080/egovframework-all-in-one/ 에서


업무사용자

로그인 : TEST1

PW : 공통12


로그인 한 뒤에

협업 > 게시판 속성관리 에서 '등록'을 누른다.


공지사항 게시판 부터 만들자

- 게시판 유형 '공지게시판' 선택


공지사항 게시판이 생성되었다.

게시판 명 : 공지사항을 클릭하면 게시판 수정화면이 나옴


----

게시판 사용등록


추가한 게시판을 사용하도록 선택해야 하므로

등록 버튼을 누른다.


게시판명 옆에 돋보기 아이콘을 누르면 게시판 목록이 나온다.

'공지사항'게시판 끝에 선택버튼을 누른다.

사용할 대상선택

일단은 뭔지 모르니까 '시스템'을 선택하고 등록버튼 클릭

등록 목록에 나옴

게시판 명 '공지사항'을 클릭하면

게시판의 사용정보가 나온다.

제공 URL이 해당 게시판 접속정보다.

제공 URL을 클릭하면

공지사항 게시판이 나온다.

게시물이 없으므로 등록 버튼을 누르면

게시물 등록화면이 나온다.

-- firefox 에서 에디터에 글쓰기가 안된다. 커서가 에디터 안으로 안들어가짐. ㅜ.ㅜ chrome에서는 됨.


공지사항을 등록한 결과

제목을 클릭하여 내용을 보면

게시판 생성할 때 댓글기능을 넣어서

댓글목록과 달기 기능이 있는데

그렇게 이쁘지는 않군...

글 내용도 짧으니 최소영역없이 한줄만 나오는것도...

템플릿 파일을 만들어 템플릿 변경을 하면 좀 낫겠지...


-----

게시판 추가시 발생하는 내용

쿼리는 대략 이렇다..

로그 파일에 쭉~ 나오는 결과임.


[IDGeneration Service] key_table에 대한 10 ID의 새로운 블록을 할당 BBS_ID.

SELECT next_id FROM COMTECOPSEQ WHERE table_name = 'BBS_ID'


UPDATE COMTECOPSEQ SET next_id = 11 WHERE table_name = 'BBS_ID'


INSERT INTO COMTNBBSMASTER (BBS_ID, BBS_TY_CODE, BBS_ATTRB_CODE, BBS_NM, BBS_INTRCN, REPLY_POSBL_AT,
FILE_ATCH_POSBL_AT, ATCH_POSBL_FILE_NUMBER, ATCH_POSBL_FILE_SIZE, TMPLAT_ID, USE_AT, FRST_REGISTER_ID,
FRST_REGIST_PNTTM ) VALUES ( 'BBSMSTR_000000000001', 'BBST03', 'BBSA01', '공지사항', '공지사항 게시판',
'N', 'Y', 3, NULL, 'TMPLAT_BOARD_DEFAULT', 'Y', 'USRCNFRM_00000000000', SYSDATE() )


INSERT INTO COMTNBBSMASTEROPTN (BBS_ID, ANSWER_AT, STSFDG_AT, FRST_REGISTER_ID, FRST_REGIST_PNTTM
) VALUES ( 'BBSMSTR_000000000001', 'Y', 'N', 'USRCNFRM_00000000000', SYSDATE() ) 


SELECT a.BBS_ID, a.BBS_TY_CODE, b.CODE_NM as BBS_TY_CODE_NM, a.BBS_ATTRB_CODE, c.CODE_NM as
BBS_ATTRB_CODE_NM, a.BBS_NM, a.TMPLAT_ID, a.USE_AT, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d')
as FRST_REGIST_PNTTM FROM COMTNBBSMASTER a LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM
COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM004' AND USE_AT='Y') b ON a.BBS_TY_CODE = b.CODE LEFT
OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM009'
AND USE_AT='Y') c ON a.BBS_ATTRB_CODE = c.CODE WHERE 1=1 ORDER BY a.FRST_REGIST_PNTTM DESC
LIMIT 10 OFFSET 0


SELECT COUNT(a.BBS_ID) FROM COMTNBBSMASTER a LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM
FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM004' AND USE_AT='Y') b ON a.BBS_TY_CODE = b.CODE
LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM009'
AND USE_AT='Y') c ON a.BBS_ATTRB_CODE = c.CODE WHERE 1=1


게시판 사용등록

SELECT a.BBS_ID, e.BBS_NM, a.TRGET_ID, a.REGIST_SE_CODE, b.CODE_NM as REGIST_SE_CODE_NM, a.USE_AT,
a.FRST_REGISTER_ID, a.FRST_REGIST_PNTTM, c.CMMNTY_ID, c.CMMNTY_NM, d.CLB_ID, d.CLB_NM, e.BBS_TY_CODE
FROM COMTNBBSUSE a LEFT OUTER JOIN COMTNBBSMASTER e ON a.BBS_ID = e.BBS_ID LEFT OUTER JOIN
COMTCCMMNDETAILCODE b ON b.CODE = a.REGIST_SE_CODE LEFT OUTER JOIN COMTNCMMNTY c ON a.TRGET_ID
= c.CMMNTY_ID LEFT OUTER JOIN COMTNCLUB d ON a.TRGET_ID = d.CLB_ID WHERE b.CODE_ID = 'COM001'
AND a.REGIST_SE_CODE != 'REGC07' ORDER BY a.FRST_REGIST_PNTTM DESC LIMIT 10 OFFSET 0


SELECT COUNT(a.BBS_ID) FROM COMTNBBSUSE a LEFT OUTER JOIN COMTNBBSMASTER e ON a.BBS_ID = e.BBS_ID
LEFT OUTER JOIN COMTCCMMNDETAILCODE b ON b.CODE = a.REGIST_SE_CODE WHERE b.CODE_ID = 'COM001'
AND a.REGIST_SE_CODE != 'REGC07'


게시글 목록

SELECT a.BBS_ID, e.BBS_NM, a.TRGET_ID, a.REGIST_SE_CODE, b.CODE_NM as REGIST_SE_CODE_NM, a.USE_AT,
a.FRST_REGISTER_ID, a.FRST_REGIST_PNTTM, c.CMMNTY_ID, c.CMMNTY_NM, d.CLB_ID, d.CLB_NM, e.BBS_TY_CODE
FROM COMTNBBSUSE a LEFT OUTER JOIN COMTNBBSMASTER e ON a.BBS_ID = e.BBS_ID LEFT OUTER JOIN
COMTCCMMNDETAILCODE b ON b.CODE = a.REGIST_SE_CODE LEFT OUTER JOIN COMTNCMMNTY c ON a.TRGET_ID
= c.CMMNTY_ID LEFT OUTER JOIN COMTNCLUB d ON a.TRGET_ID = d.CLB_ID WHERE b.CODE_ID = 'COM001'
AND a.BBS_ID = 'BBSMSTR_000000000001' AND a.TRGET_ID = 'SYSTEM_DEFAULT_BOARD'


SELECT a.BBS_ID, a.BBS_TY_CODE, b.CODE_NM as BBS_TY_CODE_NM, a.BBS_INTRCN, a.BBS_ATTRB_CODE,
c.CODE_NM as BBS_ATTRB_CODE_NM, a.BBS_NM, a.TMPLAT_ID, d.TMPLAT_NM, d.TMPLAT_COURS, a.FILE_ATCH_POSBL_AT,
a.ATCH_POSBL_FILE_NUMBER, a.ATCH_POSBL_FILE_SIZE, a.REPLY_POSBL_AT, a.FRST_REGISTER_ID, e.USER_NM
as FRST_REGISTER_NM, a.USE_AT, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM
,(SELECT IFNULL(USE_AT,'N') FROM COMTNBBSUSE WHERE BBS_ID = 'BBSMSTR_000000000001' AND TRGET_ID
IN ('USRCNFRM_00000000000', 'SYSTEM_DEFAULT_BOARD') ) as AUTH_FLAG FROM COMTNBBSMASTER a LEFT
OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM004'
AND USE_AT='Y') b ON a.BBS_TY_CODE = b.CODE LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM
FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM009' AND USE_AT='Y') c ON a.BBS_ATTRB_CODE = c.CODE
LEFT OUTER JOIN COMTNTMPLATINFO d ON a.TMPLAT_ID = d.TMPLAT_ID LEFT OUTER JOIN COMVNUSERMASTER
e ON a.FRST_REGISTER_ID = e.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'


SELECT a.BBS_ID, a.ANSWER_AT, a.STSFDG_AT, a.FRST_REGISTER_ID, b.USER_NM as FRST_REGISTER_NM,
DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM FROM COMTNBBSMASTEROPTN a
LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID = b.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'


SELECT a.NTT_ID, a.NTT_SJ, a.FRST_REGISTER_ID, IFNULL(b.USER_NM, a.NTCR_NM) as FRST_REGISTER_NM,
DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM, a.RDCNT, a.PARNTSCTT_NO,
a.ANSWER_AT, a.ANSWER_LC, a.USE_AT, a.ATCH_FILE_ID, a.BBS_ID, a.NTCE_BGNDE, a.NTCE_ENDDE FROM
COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID = b.ESNTL_ID WHERE a.BBS_ID
= 'BBSMSTR_000000000001' ORDER BY a.SORT_ORDR DESC, NTT_NO ASC LIMIT 10 OFFSET 0


SELECT COUNT(a.NTT_ID) FROM COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID
= b.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'


SELECT a.BBS_ID, a.BBS_TY_CODE, b.CODE_NM as BBS_TY_CODE_NM, a.BBS_INTRCN, a.BBS_ATTRB_CODE,
c.CODE_NM as BBS_ATTRB_CODE_NM, a.BBS_NM, a.TMPLAT_ID, d.TMPLAT_NM, d.TMPLAT_COURS, a.FILE_ATCH_POSBL_AT,
a.ATCH_POSBL_FILE_NUMBER, a.ATCH_POSBL_FILE_SIZE, a.REPLY_POSBL_AT, a.FRST_REGISTER_ID, e.USER_NM
as FRST_REGISTER_NM, a.USE_AT, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM
,(SELECT IFNULL(USE_AT,'N') FROM COMTNBBSUSE WHERE BBS_ID = 'BBSMSTR_000000000001' AND TRGET_ID
IN ('USRCNFRM_00000000000', 'SYSTEM_DEFAULT_BOARD') ) as AUTH_FLAG FROM COMTNBBSMASTER a LEFT
OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM004'
AND USE_AT='Y') b ON a.BBS_TY_CODE = b.CODE LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM
FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM009' AND USE_AT='Y') c ON a.BBS_ATTRB_CODE = c.CODE
LEFT OUTER JOIN COMTNTMPLATINFO d ON a.TMPLAT_ID = d.TMPLAT_ID LEFT OUTER JOIN COMVNUSERMASTER
e ON a.FRST_REGISTER_ID = e.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'


SELECT IFNULL(MAX(SORT_ORDR),0)+1 AS NTT_NO FROM COMTNBBS WHERE BBS_ID = 'BBSMSTR_000000000001'

INSERT INTO COMTNBBS (NTT_ID, BBS_ID, NTT_SJ, NTT_CN, SORT_ORDR, NTCR_ID, NTCR_NM, PASSWORD,
RDCNT, NTCE_BGNDE, NTCE_ENDDE, ANSWER_AT, PARNTSCTT_NO, NTT_NO, ANSWER_LC, ATCH_FILE_ID, FRST_REGISTER_ID,
FRST_REGIST_PNTTM, USE_AT ) VALUES ( 1, 'BBSMSTR_000000000001', '첫번째 공지사항', '첫번째 공지사항입니다.',
1, 'TEST1', '테스트1', '', 0, '20180930', '20190331', 'N', '0', 1, '0', NULL, 'USRCNFRM_00000000000',
SYSDATE(), 'Y' )


SELECT a.NTT_ID, a.NTT_SJ, a.FRST_REGISTER_ID, IFNULL(b.USER_NM, a.NTCR_NM) as FRST_REGISTER_NM,
DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM, a.RDCNT, a.PARNTSCTT_NO,
a.ANSWER_AT, a.ANSWER_LC, a.USE_AT, a.ATCH_FILE_ID, a.BBS_ID, a.NTCE_BGNDE, a.NTCE_ENDDE FROM
COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID = b.ESNTL_ID WHERE a.BBS_ID
= 'BBSMSTR_000000000001' ORDER BY a.SORT_ORDR DESC, NTT_NO ASC LIMIT 10 OFFSET 0


SELECT IFNULL(MAX(RDCNT),0)+1 AS RDCNT FROM COMTNBBS WHERE BBS_ID = 'BBSMSTR_000000000001'
AND NTT_ID = 1


UPDATE COMTNBBS SET RDCNT = 1, LAST_UPDUSR_ID = 'USRCNFRM_00000000000', LAST_UPDT_PNTTM = SYSDATE()
WHERE BBS_ID = 'BBSMSTR_000000000001' AND NTT_ID = 1


SELECT a.NTT_SJ, a.NTCR_ID, a.NTCR_NM, a.NTT_NO, a.NTT_CN, a.PASSWORD, a.FRST_REGISTER_ID,
b.USER_NM as FRST_REGISTER_NM, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM,
a.NTCE_BGNDE, a.NTCE_ENDDE, a.RDCNT, a.USE_AT, a.ATCH_FILE_ID, a.BBS_ID, a.NTT_ID, a.PARNTSCTT_NO,
a.ANSWER_AT, a.ANSWER_LC, a.SORT_ORDR, c.BBS_TY_CODE, c.BBS_ATTRB_CODE, c.REPLY_POSBL_AT, c.FILE_ATCH_POSBL_AT,
c.ATCH_POSBL_FILE_NUMBER, c.BBS_NM FROM COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID
= b.ESNTL_ID LEFT OUTER JOIN COMTNBBSMASTER c ON a.BBS_ID = c.BBS_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'
AND a.NTT_ID = 1


SELECT a.BBS_ID, a.BBS_TY_CODE, b.CODE_NM as BBS_TY_CODE_NM, a.BBS_INTRCN, a.BBS_ATTRB_CODE,
c.CODE_NM as BBS_ATTRB_CODE_NM, a.BBS_NM, a.TMPLAT_ID, d.TMPLAT_NM, d.TMPLAT_COURS, a.FILE_ATCH_POSBL_AT,
a.ATCH_POSBL_FILE_NUMBER, a.ATCH_POSBL_FILE_SIZE, a.REPLY_POSBL_AT, a.FRST_REGISTER_ID, e.USER_NM
as FRST_REGISTER_NM, a.USE_AT, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM
,(SELECT IFNULL(USE_AT,'N') FROM COMTNBBSUSE WHERE BBS_ID = 'BBSMSTR_000000000001' AND TRGET_ID
IN ('USRCNFRM_00000000000', 'SYSTEM_DEFAULT_BOARD') ) as AUTH_FLAG FROM COMTNBBSMASTER a LEFT
OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM004'
AND USE_AT='Y') b ON a.BBS_TY_CODE = b.CODE LEFT OUTER JOIN (SELECT CODE_ID, CODE, CODE_NM
FROM COMTCCMMNDETAILCODE WHERE CODE_ID = 'COM009' AND USE_AT='Y') c ON a.BBS_ATTRB_CODE = c.CODE
LEFT OUTER JOIN COMTNTMPLATINFO d ON a.TMPLAT_ID = d.TMPLAT_ID LEFT OUTER JOIN COMVNUSERMASTER
e ON a.FRST_REGISTER_ID = e.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'


SELECT a.BBS_ID, a.ANSWER_AT, a.STSFDG_AT, a.FRST_REGISTER_ID, b.USER_NM as FRST_REGISTER_NM,
DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM FROM COMTNBBSMASTEROPTN a
LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID = b.ESNTL_ID WHERE a.BBS_ID = 'BBSMSTR_000000000001'



728x90
BLOG main image
"그게 뭐 어쨌다는 거냐?" 늘 누가 나에게 나에대한 말을할 때면 이말을 기억해라. by nobang

카테고리

nobang이야기 (1933)
Life With Gopro (7)
Life With Mini (79)
Diary (971)
너 그거 아니(do you know) (162)
난 그래 (159)
Study (290)
Cloud (26)
Go lang (30)
Front-end (27)
Device (3)
MAC (1)
Spring framework (49)
Java (13)
English (39)
SOA (0)
Idioms (7)
모르는거 (5)
WriteEnglish (10)
Android (56)
속지말자 (10)
Project (34)
Poem (15)
Song (0)
Photo (113)
낙서장 (45)
일정 (0)
C.A.P.i (2)
PodCast (0)
nobang (27)
고한친구들 (4)
recieve (0)
History (0)
android_app (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :