아직 장바구니쪽은 로컬 환경에서 개발중에 있고요.
운영서버에는 완성되면 넣을겁니다.
추가 기능:
  db 다이어그램 팝업창
  장바구니 상품 db 추가  
 
p.s
최근에 Jenkins 에 대해서 알아보고 있습니다.
aws e2c에서 배포하는 방법을 바꿔볼 예정입니다.
그리고 조금 급하게 개발해서 생각하다보니 기존 유저 테이블의 유일키 시퀀스로 자동 카운팅 하고 있었는데요.
아이디도 추가 pk 로 만들어서 복합키로 작성할거고요.
회원가입시 아이디 중복 체크로 변경할듯합니다.

 

부분적으로 좀 문제 되던 곳들을 수정했습니다.
일단 모든 아이디에서 다른 아이디 게시글 수정 오류,
 길이 사이즈가 db 사이즈에 맞지않는 오류
프론트단 백엔드단에서 모두 길이사이즈를 잘라서 저장합니다.

 내일 상품 주문이랑 마이프로필 만들예정입니다

추가 기능 개발 예정
댓글기능 ,게시판을 필터링, 검색 기능

 

 
 

이런식으로 로그아웃이 안되는 현상이 발생했는데요. 
이전:
개인 개발환경:
 /logout post-> /logout post 잘됨
aws 운영환경:
 /logout post-> /logout post 안됨 mix contents 발생
 
이번에 문제가 되는부분이 로그아웃 개발할때 /logout 이런식으로 했습니다.

실제 운영서버에서는 mixcontents오류가발생하더군요.

그래서 현재main/logout으로 경로를 axios post를 보내고 spring에서도 main/logout post 해주니까 잘되었습니다.

p.s 아직 정확한 원인을 몰라서 아마 aws에서 로드벨런싱 하는부분에 규칙이 잇는듯한데 아직 잘모르겠습니다. 공부해서 알게되면 다시 재작성 하겠습니다.
 
변경 이후:
개인 개발환경:
/Main/logout post-> /Main/logout post 잘됨
aws 운영환경:
/Main/logout post-> /Main/logout post 잘됨 
 

 

실제 웹사이트를 배포했고요.
가상 서버는 aws인 아마존에서 운영하고 있습니다.
일단 가볍게 만든거여서 차차 세세한부분들은 개발을 진행을 계속 할 예정입니다.
내일은 프론트 단들을 마무리할거로 목표를 잡을거고요
백엔드 단에서 장바구니나 주문 관련된것들을 만들예정입니다.
url은 비공개입니다. 보안 위험성이 있어서 노출 시킬 생각은 없습니다. 
 

 

너무 피곤해서 설명은 내일이나 주말에 할게여

이전 문제
2023.05.28 - [Spring] - spring vue 웹 배포 01 -yml 경로 찾는 문제

 

spring vue  웹 배포 01 -yml 경로 찾는 문제

어제부터 배포 하려고 하는데 기존에는 war 파일을 배포해서 tomcat서버에서 실행하였는데요. 이번엔 jar로 배포해서 spring boot를 이용해서 내부 서버로 실행 하려고 합니다. 지금 @Autowired private Envir

kwaksh2319.tistory.com

일단 jar, bootJar에 대한 차이를 몰랐던게 컷습니다.
일단 저는 spring boot를 이용하기 때문에 jar가 아니라 bootjar를 이용해서 jar파일을 만들어서 빌드해야하더군요.
로컬에선 실행되었고 aws나 gcb를 이용해서 실제 웹 배포를 할겁니다.
 

  1. jar 태스크:
    • 일반적인 Java 애플리케이션의 JAR 파일을 생성합니다.
    • 스프링 부트 특정 기능을 사용하지 않는 경우에 사용됩니다.
    • duplicatesStrategy를 사용하여 중복 리소스 처리 방법을 설정할 수 있습니다.
  2. bootJar 태스크:
    • 스프링 부트 애플리케이션의 실행 가능한 JAR 파일을 생성합니다.
    • 내부적으로 spring-boot-gradle-plugin 플러그인이 제공하는 기능을 활용합니다.
    • 스프링 부트의 설정을 자동으로 처리하고, 내장된 웹 서버를 실행할 수 있도록 구성됩니다.
    • MANIFEST.MF 파일에 스프링 부트 애플리케이션의 메인 클래스를 설정합니다.
    • 내장된 웹 서버와 함께 애플리케이션을 실행하기 위해 필요한 라이브러리 및 설정을 포함합니다.

어제부터 배포 하려고 하는데 
기존에는 war 파일을 배포해서  tomcat서버에서 실행하였는데요. 
이번엔 jar로 배포해서 spring boot를 이용해서 내부 서버로 실행 하려고 합니다.
지금 

@Autowired
private Environment env;

클래스에서 yml을 읽어오지 못하고 있거든요 
인텔리제이에선 

env is not null
spring.datasource.driver-class-name is not null
Driver class name: org.h2.Driver
spring.datasource.url: jdbc:h2:file:~/data/webDemo

문제 없이 읽어오는데요 
실제 프로그램 파워쉘을 이용해서 jar를 실행하면 

이런식으로 yml을 못읽어오거든요 yml은 현재 jar랑 동일한 위치에 있고 

java -jar webDemo.jar --spring.config.location=경로\application.yml

지정해서 실행해도 

datasource 위치를 못찾거든요 흠 좀더 찾아보겠습니다.
정 안되겠다 싶으면 장바구니 하던거 마무리 짓겠습니다.

테이블 BasketId 복합키고요 Baskets는 상품들이 장바구니에 들어가는 얘들이고요
status 상태에 따라 상태변경 하는데 아직 테스트는 안했습니다.
테스트는 내일 할수 있을까요.. 내일 회사에서 늦게올것같은데.. ㅠ 

status 장바구니 B, 삭제 D, 결재 C

테이블 


@Entity
@Table(name = "Baskets")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Baskets {

    @EmbeddedId
    private BasketId basketId;

    @NotEmpty
    @Column(name = "PRODUCT_NAME")
    private String productName;

    @NotNull
    private BigDecimal price;

    @NotEmpty
    @Column(name = "BIND_NUMBER")
    private String bindNumber;

    //status 장바구니 B, 삭제 D, 결재 C
    @NotEmpty
    @Column(name = "STATUS")
    private String status;

}

@Embeddable
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class BasketId implements Serializable {

    @NotNull
    @Column(name = "PRODUCT_ID")
    private Long productId;

    @NotNull
    @Column(name = "USERS_ID")
    private Long usersId;

    @NotNull
    @Column(name = "date")
    private String date;

}

Model

@Repository
@Transactional
public class BasketsDao {
    @Autowired
    private EntityManagerFactory entityManagerFactory;

    //장바구니 리스트
    public List<Baskets> findAll(String userName, int page, int size) {
        List<Baskets> basketsList = null;
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try{
            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

            CriteriaQuery<Baskets> criteriaQuery = criteriaBuilder.createQuery(Baskets.class);

            Root<Baskets> root = criteriaQuery.from(Baskets.class);

            // 복합키 검색 조건 생성
            Predicate compositeKeyPredicate = criteriaBuilder.and(
                    criteriaBuilder.equal(root.get("USERS_ID"), userName)
            );
            // 상태 검색 조건 생성
            Predicate statusPredicate = criteriaBuilder.equal(root.get("status"), "B");

            // 검색 조건 결합
            Predicate finalPredicate = criteriaBuilder.and(compositeKeyPredicate, statusPredicate);

            criteriaQuery.select(root);
            criteriaQuery.where(finalPredicate);

            TypedQuery<Baskets> typedQuery = entityManager.createQuery(criteriaQuery);
            typedQuery.setFirstResult((page - 1) * size);
            typedQuery.setMaxResults(size);
            
            basketsList = typedQuery.getResultList();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(entityManager!=null){
                entityManager.close();
            }
        }
        return basketsList;
    }

    //장바구니 등록
    public void save(Baskets baskets) {
        System.out.println("등록");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try{
            entityManager.getTransaction().begin();
            entityManager.persist(baskets);
            entityManager.getTransaction().commit();

        }catch (Exception e){
            entityManager.getTransaction().rollback();
            e.printStackTrace();
        }finally {
            if(entityManager!=null){
                entityManager.close();
            }
        }
    }

    //장바구니 삭제 및 결제
    //update로 처리
    public void update(String bindNumber,String status) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try{
            entityManager.getTransaction().begin();
            Baskets baskets = entityManager.find(Baskets.class, bindNumber);
            if (baskets != null) {
                baskets.setStatus(status);
                entityManager.merge(baskets);
                entityManager.getTransaction().commit();
                entityManager.refresh(baskets);
            } else {
                // 상품이 존재하지 않는 경우 예외 처리
                throw new IllegalArgumentException("Invalid product id: " + bindNumber);
            }
        }catch (Exception e){
            e.printStackTrace();
            entityManager.getTransaction().rollback();
        }finally {
            entityManager.close();
        }
    }

}

Service

@Service
public class BasketServiceImpl  implements BasketService {
    @Autowired
    BasketsDao basketsDao;
    //장바구니 담기
    public void save(Baskets baskets) {
        basketsDao.save(baskets);
    }
    //유저 장바구니 리스트 
    public List<Baskets> findAll(String userName, int page, int size) {
        return basketsDao.findAll(userName,page,size);
    }
    //상태 : 결제, 삭제, 장바구니 
    public void update(String bindNumber,String status) {
        basketsDao.update(bindNumber,status);
    }
}

Contoller 

@Controller
public class BasketController {
    @Autowired
    private BasketServiceImpl basketService;
    
    //장바구니 담기
    @GetMapping("/api/Baskets")
    @ResponseBody
    public List<Baskets> GetBaskets( int page,int size, HttpServletRequest request){
        List<Baskets> Baskets = null;
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {

            System.out.println("not success");
            // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
            return Baskets;
        }
       return basketService.findAll(session.getId(),page,size);
    }
    
    //유저 장바구니 리스트 
    @PostMapping("/Baskets/Post")
    public String PostBaskets(@RequestBody Baskets baskets, HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {

            System.out.println("not success");
            // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
            return "redirect:/fail";
        }
        basketService.save(baskets);
        System.out.println("baskets products");
        return "redirect:/index.html";
    }
    
   //상태 : 결제, 삭제, 장바구니 
    @PatchMapping("/api/Baskets/Patch/{BindNumber}/{Status}")
    public ResponseEntity<?> updatePatch(@PathVariable String BindNumber,@PathVariable String Status,HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {

            System.out.println("not success");
            // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
            return ResponseEntity.badRequest().build();
        }
        try{
            basketService.update(BindNumber,Status);
        }catch (Exception e){
            e.printStackTrace();
            return ResponseEntity.badRequest().build();
        }
        return ResponseEntity.ok().build();
    }
}

 

+ Recent posts