1. 조건문

- 주어진 조건에 따라 애플리케이션을 다르게 동작하도록 하는 것

[조건문의 문법]
1) IF
  - if(true) => result : true => 실행
  - if(false) => result : false => 실행되지 않음


2) ELSE
  - if 조건문에 해당하지 않은 경우 실행되지 않음


3) ELSE IF
  - if 조건문 다음에 오는 조건문


[조건문의 응용]
- if(true) : 항상 실행되는 조건이기에 올바르지 않음
- prompt('질문내용'); : 입력창을 통해 사용자로부터 정보를 입력받을 수 있음

 

 

2. 반복문

 - (Loop, Iterate) 반복적인 작업을 지시하는 방법

 

1) while
    while(boolean){
        반복해서 실행할 코드
    }
    - 조건이 true에서 false가 될때까지 실행 (조건이 만족하면 실행)
    - while(true) : 무한한 반복을 의미하므로 가급적 사용X
    - while (i < 10) : i의 값이 10보다 작다면 true, 아니면 false, i 값이 10이 되면 종료


2) for
    for(초기화; 반복조건(true/false); 반복이 될 때마다 실행되는 코드){
        반복해서 실행될 코드
    }



[반복문의 제어]
  - break : 반복문의 종료
  - continue : 다음 코드 실행하지 않고 다음 증감값으로 이동 (반복문을 종료하지 않음)



[반복문의 중첩]
    for(i=0; i<10; i++){
        for(j=0; j<10; j++){
            반복해서 실행할 코드
        }
    }

1. 변수

[변수]
 - JavaScript에서 변수는 var로 시작 (변수 선언의 의미)
 - 특수문자를 제외한 모든 문자로 시작 가능
 - 한번 선언한 이후에는 또 var를 안붙여도됨
 - 숫자, 문자의 연산이 모두 가능함

[변수의 효용]
 - 변수를 쓰기 전 : 모든 영역이 변할 수 있는 영역
    alert(100+10);                  // 100을 고치기 위해서는 모든 줄을 다 고쳐줘야함
    alert((100+10)/10);
    alert(((100+10)/10)-10);
    alert((((100+10)/10)-10)*10);
- 변수 사용 후 : 첫 줄은 변할 수 있는 영역, 나머지 줄은 변하지 않는 영역
    a = 100;        // 한번만 고치면 됨
    a = a + 10;
    alert(a);
    a = a / 10;
    alert(a);
    a = a - 10;
    alert(a);
    a = a * 10;      
    alert(a);
- 변수를 사용하지 않으면 실수가 나올 수 있고 효율이 떨어지므로 유지보수력이 떨어지는 좋지 않은 코드가 됨

 

 

2. 비교 연산자

[연산자]
- 어떤 작업을 컴퓨터에 지시하기 위한 기호

[대입 연산자 =]
- a(변수)   =(대입 연산자)  1(상수 : 고정된 값. 변수에 대응되는 개념)
- 우항의 값을 좌항의 변수에 대입할때 사용

[동등 연산자 ==]
- equal operator
- 좌항과 우항을 비교해서 값이 같다면 true 다르다면 false
- 값의 자료형보다 의미가 같으면 같다고 판단
- 숫자 1을 true로 간주, 1 외의 숫자들을 false로 간주

[일치 연산자 ===]
- strict equal operator
- 좌항과 우항이 정확하게 같을 때 true 다르다면 false
- 정확하다는 의미 : 데이터형까지 같은 경우

* 동등 연산자를 사용하면 버그가 발생할 수 있는 가능성이 높아짐! 일치 연산자를 사용하자!
* 동등연사자와 일치 연산자 참고자료 : https://dorey.github.io/JavaScript-Equality-Table/

 

 

3. 부정과 부등호

[부정]

- !   : 부정을 의미
- !=  : 같지 않다를 의미
- !== : 정확하게 같지 않다라는 의미

[부등호]

- >   : 크다
- <   : 작다
- >=  : 크거나 같다
- <=  : 작거나 같다

1. 코드 작성과 실행

- HTML 구조 안에서 <script> </script>로 지정된 부분이 javaScript 영역

 

 

2. 콘솔 사용법

- alert : 알림창

- console.log : 콘솔 프린트

- Uncaught ReferenceError: 주석 is not defined at sample.html:8
                                                                                (파일명:row 8)

 

3. 도구

[IDE]

통합 개발 환경(integrated development environment, IDE)은 코딩, 디버그, 컴파일, 배포 등 
프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어

 

 

4. 주석

 

[주석]

- 좋은 주석이란? 주석조차 필요하지않은 쉽게 이해할 수 있고 가독성이 좋은 코드
- 코드에 대한 간단하고 명료한 주석 작성 필요
- 특정 코드를 일시적으로 작동하지 않게 하기 위해 사용하기도 함

 

 

5. 줄바꿈과 여백

[세미콜론]
- 명령이 끝났다는 것을 명시적으로 표시하기 위한 기호 
- 자바스크립트에서 줄이 바뀌면 세미콜론 없어도 명령이 끝났다고 간주함 (쓰는걸 권장)

[탭]
- 스페이스 4번정도의 들여쓰기 처리
- 블록 지정 후 탭키 누르면 한꺼번에 들여쓰기 처리
- 가독성을 높이기 위해 사용

 

 

6. 숫자와 문자

[수의 표현]
- 자바스크립트에서는 큰 따옴표나 작은 따옴표가 붙지 않은 숫자는 숫자로 인식
- 자바스크립트에서는 정수, 실수 구분 없이 사용할 수 있어 다른 언어에 비해 덜 엄격함

[수의 연산]
- Math라는 객체 안에 pow라는 명령이 있어서 사용
- Math는 수학과 관련된 명령들의 카테고리

 

[문자]
- 문자로 인식되기 위해서는 작은 따옴표 또는 큰 따옴표 안에 작성해야함
- \ (escape): 역슬래시 바로 뒤에 있는 문자 하나는 문자로 해석
- typeof 문자/숫자 : 자료형을 알려줌
- string : 문자열
- number : 숫자

[문자의 연산]
- \n : 줄바꿈
- 문자 + 문자 : 문자 합치기
- .length : 문자 길이
- String : 문자열들과 관련이 있는 명령어들의 카테고리

'생활코딩 강의 - JavaScript > 기초' 카테고리의 다른 글

[day-3] 조건문, 반복문  (0) 2024.10.15
[day-2] 변수, 비교 연산자  (0) 2024.10.11

1. JPA(Java Persistence API)

- 자바의 ORM 기술 표준 명세로 Java에서 제공하는 API

- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

- ORM이기 때문에 자바 클래스와 DB테이블을 매핑(SQL을 매핑하지않음)

- ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink,

   DataNucleus같은 ORM 프레임워크를 사용해야 함

* ORM : 객체와 DB를 연결해주는 기술

 

1) spring.jpa.hibernate.ddl-auto 옵션 
- create : 새로운 테이블 생성
- createdrop : 기존 테이블을 지우고 새로 생성
- none : 수동으로 직접 테이블을 생성해야함
- update : 현재 테이블 있으면 만들지 말고 데이터 누적. 테이블이 없으면 새로 생성(많이 사용). 

                시작 시 도메인과 스키마 비교하여 필요한 컬럼 추가 등의 작업 실행. 데이터는 삭제하지 않음.
- validate : 기존과 새로운 것의 달라진 내용만 표시해줌. 스키마가 적합한지 검사함. 문제가 있으면 예외 발생.

2) spring.jpa.properties.hibernate.format_sql 옵션 
- 콘솔에 sql 코드 보여질 때 문단 정리

3) spring.jpa.show-sql 옵션 
- 실행했을 때 콘솔에 sql 코드 보여지기

4) spring.jpa.hibernate.naming.physical-strategy 옵션
- 엔티티클래스의 카멜 케이스 필드명을 DB의 스네이크 케이스 컬럼명으로 자동 매핑

 


(테스트 예제)
File ▶ New ▶ Spring Starter Project ▶ Name : test4 / Group : com.example.test4 / Artifact : test4 / Package : com.example.test4 ▶ Lombok, DevTool, Sprig Web, oracle, JDBC, Spring Data JPA 선택

▶ application. properties 파일

#view resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#jdbc
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=fin02
spring.datasource.password=fin02

#spring data jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl


▶ pom.xml 파일

<!--JSP, JSTL-->
<dependency>
   <groupId>jakarta.servlet</groupId>
   <artifactId>jakarta.servlet-api</artifactId>
</dependency>

<dependency>
   <groupId>org.glassfish.web</groupId>
   <artifactId>jakarta.servlet.jsp.jstl</artifactId>   
</dependency>

<dependency>
   <groupId>jakarta.servlet.jsp.jstl</groupId>
   <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>

<!--톰캣-->
<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-jasper</artifactId>
</dependency>


▶ src/main/java 폴더에 패키지 생성
- com.example.test4.controller
- com.example.test4.dto
- com.example.test4.entity
- com.example.test4.repository

▶ index.jsp

<html>
<head>
   <meta charset="UTF-8">
   <title>JPA 실습</title>
</head>
<body>
    <a href="/articles"> 글목록으로 가기 </a>
</body>
</html>


▶ com.example.test4.entity 패키지에 Article.java 파일 생성
▶ Article.java

@Entity 
// 클래스명이 테이블명이 됨. 만약 테이블명을 다르게 하고 싶으면 @Table(name = "board")라고 @Entity 밑에 써야함. 
// import jakarta.persistence.Table;
@NoArgsConstructor // 디폴트 생성자
@AllArgsConstructor // 전체 생성자
@Getter // Getter 메서드
@SequenceGenerator(   // sequence 정의
      name = "article_seq_generator",
      sequenceName = "article_seq",
      initialValue = 1, allocationSize = 1)

public class Article {
        @Id  // primary key
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "article_seq_generator")
        private Long id;

        @Column
        private String title;

        @Column
        private String content;
}


▶com.example.test4.repository 패키지에 ArticleRepository 인터페이스 생성  
▶ ArticleRepository.java

public interface ArticleRepository extends CrudRepository<Article, Long>{
                                           // CrudRepository를 이용해서 Aritcle DB에 있는 데이터 가져오기

    @Override
     ArrayList<Article> findAll();  // CrudRepository가 가지고 있는 findAll 메서드를 오버라이드
}


▶ ArticleController

@Controller
public class ArticleController {

    @Autowired
    ArticleRepository articleRepository;

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

    @GetMapping("/articles")
    public String list(Model model) {
        // 1. DB에 있는 모든 데이터 가져오기
        List<Article> articleEntityList  = articleRepository.findAll();

        // 2. 가져온 데이터를 모델에 넣기
        model.addAttribute("articleList", articleEntityList);

        // 3. view 페이지로 이동하기
        return "list";
    }
}


▶ list.jsp

<html>
<head>
   <title>list</title>
</head>
<body>
   <div align="center">
      <hr color="green" width="300">
      <h2>게 시 판 리 스 트</h2>
      <a href="/articles/new">글쓰기</a>
      <hr color="green" width="300">
      <table border="1" width="500">
         <tr bgcolor="yellow">
            <th>번호</th>
            <th>제목</th>
            <th>내용</th>
         </tr>
         <c:if test="${empty articleList}">
         <tr>
            <td colspan="3">등록된 게시글이 없습니다.</td>
         </tr>
         </c:if>      
         <c:forEach var="dto" items="${articleList}">
         <tr>
            <td>${dto.id}</td>
            <td>${dto.title}</td>
            <td>${dto.content}</td>
         </tr>      
         </c:forEach>
      </table>
   </div>
</body>
</html>

 

▶ ArticleController

@GetMapping("/articles/new")
public String articleForm() {
      return "inputForm";
}


▶ inputForm.jsp

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <form name="f" action="/articles/create" method="post">
      제목 : <input type="text" name="title"><br>
      내용 : <input type="text" name="content"><br>
      <input type="submit" value="전송">   
   </form>
</body>
</html>


▶ ArticleForm (DTO) 에 생성자 추가

public Article toEntity() {
    return new Article(id, title, content);
}


▶ ArticleController

@GetMapping("/articles/new")
public String articleForm() {
       return "inputForm";
}

@PostMapping("/articles/create")
public String createArticle(@ModelAttribute ArticleForm articleForm) { // @ModelAttribute 생략가능
       //1. DTO를 엔티티로 변환
      Article article = articleForm.toEntity();

      //2. Repository로 엔티티를 DB에 저장
      Article saved = articleRepository.save(article);
 
      System.out.println(saved.toString());

      return "redirect:/articles";
}

 

▶http://localhost:8080/ 실행

 

▶list.jsp

<html>
<head>
   <title>list</title>
</head>
<body>
   <div align="center">
      <hr color="green" width="300">
      <h2>게 시 판 리 스 트</h2>
      <a href="/articles/new">글쓰기</a>
      <hr color="green" width="300">
      <table border="1" width="500">
         <tr bgcolor="yellow">
            <th>번호</th>
            <th>제목</th>
            <th>내용</th>
         </tr>
         <c:if test="${empty articleList}">
         <tr>
            <td colspan="3">등록된 게시글이 없습니다.</td>
         </tr>
         </c:if>      
         <c:forEach var="dto" items="${articleList}">
         <tr>
            <td><a href="/articles/${dto.id}">${dto.id}</a></td>
            <td>${dto.title}</td>
            <td>${dto.content}</td>
         </tr>      
         </c:forEach>
      </table>
   </div>
</body>
</html>


▶ ArticleController

@GetMapping("/articles/{id}") // {id}에 파라미터값 들어옴
public String getArticle(@PathVariable Long id, Model model) { // {id} 값이 Pathvariable를 통해 id로 들어옴
     System.out.println("id = " + id);
     //Optional article= articleRepository.findById(id); // 원래 자료형은 Optional임
     Article article = articleRepository.findById(id).orElse(null); // orElse를 적으면 Article 객체로 받을 수 있음 
     model.addAttribute("getArticle", article);
     return "show";
}


▶ show.jsp

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <form name="f" action="/articles/update" method="post">
      번호 : <input type="text" name="id" value="${getArticle.id}" readOnly> <br>
      제목 : <input type="text" name="title" value="${getArticle.title}"><br>
      내용   : <input type="text" name="content" value="${getArticle.content}"><br>
      <input type="button" value="삭제" onclick="location.href='/article/${getArticle.id}/delete'">
      <input type="submit" value="수정">   
   </form>
</body>
</html>


▶ ArticleController

@PostMapping("/articles/update")
public String update(ArticleForm articleform) {
      //1.DTO를 엔티티로 변환하기
      Article article = articleform.toEntity();

      //2.엔티티를 DB에 저장하기
      Article target = articleRepository.findById(article.getId()).orElse(null); // DB에서 기존 데이터 가져오기
      if (target != null) { // 기존 데이터가 있는지 확인하고 있으면 udpate
           articleRepository.save(article);
      }

      //3.수정 후 결과 페이지로 이동하기
      return "redirect:/articles/"+article.getId();
      // return "redirect:/articles/";  // 목록으로
}


@GetMapping("/article/{id}/delete")
public String delete(@PathVariable Long id) {
      //1. 삭제할 대상을 가져오기
      Article article = articleRepository.findById(id).orElse(null);

      //2. 대상 엔티티를 삭제하기
      if (article != null) {
          articleRepository.delete(article);
      }

      //3. 삭제 후 목록 페이지로 이동하기
      return "redirect:/articles";
}
 

2. 특수 쿼리문 (직접 쿼리문 작성)

▶ ArticleRepository.java

@Transactional  // 직접 쿼리 작성할때 반드시 필요
@Modifying(clearAutomatically = true)
@Query(value="update article set content='kkk' where id = :id", nativeQuery=true) // :id는 값을 전달 받게됨
int updateTest(@Param("id")Long id);


▶  ArticleController

@GetMapping("/")
public String index() {
    int res = articleRepository.updateTest(1L);
    return "index";
}

 

▶http://localhost:8080/

 

1. 게시판 관리 프로그램

1) File ▶ New ▶ Spring Starter Project ▶ MyBatis Framework, Spring Web, Oracle Driver, JDBC API, Spring Boot DevTools 체크 (pom.xml에 의존성 주입하던거 대신 만들어줌) 

 

2) resources 안에 WEB-INF 폴더만들기 ▶ 안에 views 폴더 만들기

3) pom.xml 톰캣 의존성 주입

<dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

 

4) pom.xml JSP 파일 의존성 주입

<dependency>
   <groupId>jakarta.servlet</groupId>
   <artifactId>jakarta.servlet-api</artifactId>
</dependency>

<dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>

<dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
   <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>

 

5) application properties 설정

#view resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#jdbc
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=fin02
spring.datasource.password=fin02

#mybatis
mybatis.type-aliases-package=com.example.test.dto     // alias가 등록되어있는 장소
mybatis.mapper-locations=/mybatis/**/*-mapper.xml     // mapper.xml로 끝나는 파일 위치
mybatis.configuration.map-underscore-to-camel-case=true

 

6) index.jsp 파일 생성

<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>스프링 부트 게시판</h1>
<h1><a href="list_board.do">게시판으로 가기</a></h1>
</body>
</html>

 

7) http://localhost:8080/ 실행

8) src/main/java에 com.example.test.dto 패키지 생성 ▶ DTO.java 생성

9) src/main/resources에 mybatis 폴더 생성 ▶ board 폴더 생성 ▶ 그 안에 board-mapper.xml 생성

10) board-mapper.xml 작성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

<mapper namespace="mybatis.board.board-mapper">

   <select id="listBoard" resultType="BoardDTO">
       select * from board1 order by num desc
   </select>

</mapper>

2. LOMBOK 

- 자바 컴파일 시점에서 특정 어노테이션으로 해당 코드를 추가할 수 있는 라이브러리

- DTO파일 ▶ windows ▶ Show view  ▶ Outline : DTO 개요를 볼 수 있음

 

1) 설치

- 프로젝트 우클릭 ▶ Spring ▶ Add Starters ▶ Available에 lombok 검색 및 체크 ▶ pom.xml 체크 후 Finish

▶ pom.xml에 들어가면 아래 내용이 추가되어있음

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

▶ 파일탐색기 C:\Users\user\.m2\repository\org\projectlombok\lombok\1.18.34 

▶ 주소경로창에 cmd 치고 엔터

▶ cmd 창에 해당 경로명이 설정되어 있음

▶ java -jar lombok-1.18.34.jar 입력 후 엔터쳐서 콘솔에서 파일 실행

▶ Specify location 버튼  ▶  SpringToolSuite4.exe 파일 찾아서 Select  ▶ Install/Update 버튼

▶ Install Successful 뜨면 Quit Installer

▶ SpringToolSuite4.ini 파일 실행

▶ 맨 하단에 -javaagent:D:\fintechkmy\springboot\sts-4.24.0.RELEASE\lombok.jar 이렇게 수정

     (경로에 한글이 있으면 STS 실행 안됨)

▶ STS DTO 파일로 돌아와서 @Data 추가하면 Outline에 Getter, Setter 메서드 모두 추가 되는 것을 알 수 있음

   @Getter 추가하면 Getter 메서드만 추가됨

 

 

2) Anotation

(1) @ToString

- 디버깅 및 로깅 편의성 : @ToString 어노테이션을 사용하면 엔티티 객체의 문자열 표현을 쉽게 생성.
                                         이는 디버깅 및 로깅 시 객체의 상태를 쉽게 확인할 수 있어 유용함.
- 코드 간결성 : @ToString 어노테이션은 롬복(Lombok) 라이브러리에서 제공하는 기능임. 
                         엔티티 클래스에서 직접 toString 메서드를 작성할 필요 없이 자동으로 생성해줌.
                         이는 코드의 간결성과 가독성을 높여줌.
- 주의사항
    - 엔티티 간의 양방향 연관 관계가 있는 경우, @ToString 어노테이션이 순환 참조를 일으킬 수 있음.
    - 이로 인해 StackOverflowError가 발생할 수 있음. 양방향 연관 관계가 있는 필드를 toString 메서드에서 제외해야함.
    - 롬복의 @ToString 어노테이션은 exclude 속성을 사용하여 특정 필드를 제외할 수 있음.

 

(2) @EqualsAndHashCode

- 롬복(Lombok) 라이브러리에서 제공하는 기능으로, 클래스의 모든 필드를 기준으로 equals 및 hashCode 메서드를 생성.
- 주로 객체의 동등성 비교와 해시 기반 컬렉션(예: HashSet, HashMap)에서 사용.
- 수동으로 작성해야 할 boilerplate 코드를 줄이고 코드의 가독성과 유지보수성을 높여줌

 

(3) @NoArgsConstructor

- Test() : 디폴트 생성자를 만들어줌

 

(4) @AllArgsConstructor
- Test(String, String, String) : 전체 매개변수가 들어간 생성자를 만들어줌

 

(테스트 예제)

File ▶ New ▶ Spring Starter Project

▶ Name : test3 / Group : com.example.test3 / Artifact : test3 / Package : com.example.test3
▶ Lombok, DevTool, Sprig Web 선택 ▶ com.example.test3 패키지 ▶ Test.java 클래스 생성

▶ Test.java

public class Test {
   private String id;
   private String name;
   private String cname;
}

▶ STS - Windows - Show view - Outline에 보면 멤버변수만 있음

▶ Test.java

@Data
public class Test {
   private String id;
   private String name;
   private String cname;
}

▶ Outline에 Getter, Setter 등이 생긴것을 확인할 수 있음

▶ 어노테이션을 @Getter 또는 @Setter로 넣을 수도 있음



+ Recent posts