<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>숙소, 체험, 장소를 모두 한 곳에서 - 에어비앤비</title>
    <link
      rel="shortcut icon"
      sizes="76x76"
      type="image/x-icon"
      href="https://a0.muscache.com/airbnb/static/logotype_favicon-21cc8e6c6a2cca43f061d2dcabdf6e58.ico"
    />
    <link rel="stylesheet" href="css/styles.css"/>
  </head>
  <body>
    <header>
      <nav>
        <div class="logo">

            <svg width="102" height="32" fill="currentcolor" style="display:inline-block">
                <path d="M29.24 22.68c-.16-.39-.31-.8-.47-1.15l-.74-1.67-.03-.03c-2.2-4.8-4.55-9.68-7.04-14.48l-.1-.2c-.25-.47-.5-.99-.76-1.47-.32-.57-.63-1.18-1.14-1.76a5.3 5.3 0 00-8.2 0c-.47.58-.82 1.19-1.14 1.76-.25.52-.5 1.03-.76 1.5l-.1.2c-2.45 4.8-4.84 9.68-7.04 14.48l-.06.06c-.22.52-.48 1.06-.73 1.64-.16.35-.32.73-.48 1.15a6.8 6.8 0 007.2 9.23 8.38 8.38 0 003.18-1.1c1.3-.73 2.55-1.79 3.95-3.32 1.4 1.53 2.68 2.59 3.95 3.33A8.38 8.38 0 0022.75 32a6.79 6.79 0 006.75-5.83 5.94 5.94 0 00-.26-3.5zm-14.36 1.66c-1.72-2.2-2.84-4.22-3.22-5.95a5.2 5.2 0 01-.1-1.96c.07-.51.26-.96.52-1.34.6-.87 1.65-1.41 2.8-1.41a3.3 3.3 0 012.8 1.4c.26.4.45.84.51 1.35.1.58.06 1.25-.1 1.96-.38 1.7-1.5 3.74-3.21 5.95zm12.74 1.48a4.76 4.76 0 01-2.9 3.75c-.76.32-1.6.41-2.42.32-.8-.1-1.6-.36-2.42-.84a15.64 15.64 0 01-3.63-3.1c2.1-2.6 3.37-4.97 3.85-7.08.23-1 .26-1.9.16-2.73a5.53 5.53 0 00-.86-2.2 5.36 5.36 0 00-4.49-2.28c-1.85 0-3.5.86-4.5 2.27a5.18 5.18 0 00-.85 2.21c-.13.84-.1 1.77.16 2.73.48 2.11 1.78 4.51 3.85 7.1a14.33 14.33 0 01-3.63 3.12c-.83.48-1.62.73-2.42.83a4.76 4.76 0 01-5.32-4.07c-.1-.8-.03-1.6.29-2.5.1-.32.25-.64.41-1.02.22-.52.48-1.06.73-1.6l.04-.07c2.16-4.77 4.52-9.64 6.97-14.41l.1-.2c.25-.48.5-.99.76-1.47.26-.51.54-1 .9-1.4a3.32 3.32 0 015.09 0c.35.4.64.89.9 1.4.25.48.5 1 .76 1.47l.1.2c2.44 4.77 4.8 9.64 7 14.41l.03.03c.26.52.48 1.1.73 1.6.16.39.32.7.42 1.03.19.9.29 1.7.19 2.5zM41.54 24.12a5.02 5.02 0 01-3.95-1.83 6.55 6.55 0 01-1.6-4.48 6.96 6.96 0 011.66-4.58 5.3 5.3 0 014.08-1.86 4.3 4.3 0 013.7 1.92l.1-1.57h2.92V23.8h-2.93l-.1-1.76a4.52 4.52 0 01-3.88 2.08zm.76-2.88c.58 0 1.09-.16 1.57-.45.44-.32.8-.74 1.08-1.25.25-.51.38-1.12.38-1.8a3.42 3.42 0 00-1.47-3.04 2.95 2.95 0 00-3.12 0c-.44.32-.8.74-1.08 1.25a4.01 4.01 0 00-.38 1.8 3.42 3.42 0 001.47 3.04c.47.29.98.45 1.55.45zM53.45 8.46c0 .35-.06.67-.22.93-.16.25-.38.48-.67.64-.29.16-.6.22-.92.22-.32 0-.64-.06-.93-.22a1.84 1.84 0 01-.67-.64 1.82 1.82 0 01-.22-.93c0-.36.07-.68.22-.93.16-.3.39-.48.67-.64.29-.16.6-.23.93-.23a1.84 1.84 0 011.6.86 2 2 0 01.21.94zm-3.4 15.3V11.7h3.18v12.08h-3.19zm11.68-8.9v.04c-.15-.07-.35-.1-.5-.13-.2-.04-.36-.04-.55-.04-.89 0-1.56.26-2 .8-.48.55-.7 1.32-.7 2.31v5.93h-3.19V11.69h2.93l.1 1.83c.32-.64.7-1.12 1.24-1.48a3.1 3.1 0 011.81-.5c.23 0 .45.02.64.06.1.03.16.03.22.06v3.2zm1.28 8.9V6.74h3.18v6.5c.45-.58.96-1.03 1.6-1.38a5.02 5.02 0 016.08 1.31 6.55 6.55 0 011.6 4.49 6.96 6.96 0 01-1.66 4.58 5.3 5.3 0 01-4.08 1.86 4.3 4.3 0 01-3.7-1.92l-.1 1.57-2.92.03zm6.15-2.52c.57 0 1.08-.16 1.56-.45.44-.32.8-.74 1.08-1.25.26-.51.38-1.12.38-1.8 0-.67-.12-1.28-.38-1.79a3.75 3.75 0 00-1.08-1.25 2.95 2.95 0 00-3.12 0c-.45.32-.8.74-1.09 1.25a4.01 4.01 0 00-.38 1.8 3.42 3.42 0 001.47 3.04c.47.29.98.45 1.56.45zm7.51 2.53V11.69h2.93l.1 1.57a3.96 3.96 0 013.54-1.89 4.1 4.1 0 013.82 2.44c.35.76.54 1.7.54 2.75v7.24h-3.19v-6.82c0-.84-.19-1.5-.57-1.99-.38-.48-.9-.74-1.56-.74-.48 0-.9.1-1.27.32-.35.23-.64.52-.86.93a2.7 2.7 0 00-.32 1.35v6.92h-3.16zm12.52 0V6.73h3.19v6.5a4.67 4.67 0 013.73-1.89 5.02 5.02 0 013.95 1.83 6.57 6.57 0 011.59 4.48 6.95 6.95 0 01-1.66 4.58 5.3 5.3 0 01-4.08 1.86 4.3 4.3 0 01-3.7-1.92l-.09 1.57-2.93.03zm6.18-2.53c.58 0 1.09-.16 1.56-.45.45-.32.8-.74 1.09-1.25.25-.51.38-1.12.38-1.8a3.42 3.42 0 00-1.47-3.04 2.95 2.95 0 00-3.12 0c-.44.32-.8.74-1.08 1.25a3.63 3.63 0 00-.38 1.8 3.42 3.42 0 001.47 3.04c.47.29.95.45 1.55.45z"></path></svg>

        </div>
        <div class="menu">

            <ul>
                <li><a href="#">호스트가 되어보세요</a></li>
                <li><a href="#">도움말</a></li>
                <li><a href="#">회원가입</a></li>
                <li><a href="#">로그인</a></li>
            </ul>


        </div>
      </nav>

      <section>
        <div class="search__box"></div>
      </section>
    </header>
    <main>
      <section>
        <div class="sec__title"></div>
        <div class="card__box">
          <div class="card">
            <div class="card__img"></div>
            <div class="card__content"></div>
          </div>
          <div class="card">
            <div class="card__img"></div>
            <div class="card__content"></div>
          </div>
          <div class="card">
            <div class="card__img"></div>
            <div class="card__content"></div>
          </div>
          <div class="card">
            <div class="card__img"></div>
            <div class="card__content"></div>
          </div>
        </div>
      </section>
      <section>
        <div class="ad"></div>
      </section>
      <section>
        <div class="sec__title"></div>
        <div class="choo__box">
          <div class="choo__img"></div>
          <div class="choo__img"></div>
          <div class="choo__img"></div>
          <div class="choo__img"></div>
          <div class="choo__img"></div>
        </div>
      </section>
      <section>
        <div class="sec__title"></div>
        <div class="sec__content"></div>
        <div class="ad"></div>
      </section>
      <section>
        <div class="sec__title"></div>
        <div class="home__box">
          <div class="home">
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
            
            <div class="home__img"></div>
            <div class="info1"></div>
            <div class="info2"></div>
            <div class="info3">
              <span class="star"></span>
              <span class="count"></span>
              <span class="type"></span>
            </div>
        
        </div>
      </section>
    </main>
  </body>
</html>

 

 

* {
  /* 전역에 패딩과 마진, 보더를 없앤다*/
  padding: 0px;
  margin: 0px;
  box-sizing: border-box;
}

.logo {
  color: white;
}

header {
  background-image: url("../images/background.jpg");
  height: 880px;
  background-size: 100%;
  background-repeat: none;
}

nav {
  display: grid;
  grid-template-columns: auto auto;
  justify-content: space-between;
  padding: 20px;
}

.menu ul {
  display: grid;
  grid-template-columns: auto auto auto auto;
  grid-column-gap: 30px;
  list-style-type: none;
}

.menu ul a {
  text-decoration: none;
  color: black;
  font-weight: 800;
  color: white;
}

.search__box {
  position: relative;
  top: 50px;
  left: 50px;
  width: 430px;
  height: 400px;
  background-color: white;
}

 

 

----------------

 

fr을 쓰면 비율로 정할 수 있다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

리액트 css 관리 // ref  (0) 2020.07.21
리액트 에어비앤비 화면구성  (0) 2020.07.20
리액트 props  (0) 2020.07.16
styled-components-snippets 리액트 자동완성  (0) 2020.07.14
props 개념  (0) 2020.07.14

'낙서장' 카테고리의 다른 글

실기 오답노트 200719  (0) 2020.07.19
실기 오답노트 200718  (0) 2020.07.19
실기 오답노트 200717  (0) 2020.07.17
실기 오답노트 200716  (0) 2020.07.16
실기 오답노트 200715  (0) 2020.07.15

 

JSP

jsp는 url 요청을 할 수 있다 (file을 요청할 수 있다는 것 index.jsp // a.png 등)

즉 톰캣을 안 탈 수도 있다는 것이다 (아파치만을 이용해서 정적파일만 받을 수도 있다는 것)

 

Spring

톰캣은 WEB-INF 밑에 접근이 불가능하다

이렇게 만들어야 URL요청이 불가능해진다 (URI로 Controller만을 이용해서 접근하도록함, 외부로부터 안전)

JSP파일을 WEB-INF에 넣자

이렇게 만들면 톰캣을 안 탈 수가 없다(컨트롤러를 타야하기 때문)

 

//templates 폴더 - 머스태치 타임리프 등

 

 

톰캣

톰캣이 실행되면 열리는 것

1 카타리나

2 web.xml -> 배포서술자 / 웹서버의 가이드 역할 / 필터
-- 바디에 넣을 문자형식 UTF-8 - 모든 인코딩을 UTF-8 로 만들기
-- 웰컴파일리스트 
-- DB Resource 
-- 커스텀 필터 등록가능(아이피 차단 등 // lucy)
-- 서블릿 매핑 -> 자바파일이 아니더라도, 이 파일에서 매핑해줄 수 있다,
( /* -> FrontConroller.java 만 주고 컨트롤러에서 라우팅하게 하자)
JSP에서는 쿼리문으로 분기를 하였는데
스프링에서는 URL파라미터를 분기해 줄 수 있다

(spring에서는 yml파일에 적어놓으면 web.xml에 자동적으로 등록이 된다)

3

 

 

-------------------

sqlsession은 DBCP, MyBatis 과 연계되어 있다

datasource DBCP - 데이터베이스 커넥션 풀링 기술
MyBatis - rs 결과를 오브젝트나 컬렉션으로 들고 있는다 - persistence - 데이터베이스에 접근해서 데이터를 오브젝트화

DB - sqlsession - repository

 

----------------

서블릿 매핑

localhost:8000/post1?cmd=test

post/1 -> url 파라미터

? -> 쿼리문

---------------

dispatcherServlet

서블릿 매핑, 프론트컨트롤러, 라우팅 등을 관리하는 객체

request요청만 추적한다

----------------

@Controller는 사용자가 요청시에 뜬다

dispatherServlet은 요청이 오면

@Controller

@RestController

를 검색하여 메모리에 띄워서 실행시킨다

-------------------

다른 어노테이션은 서버 실행시에 미리 다 뜨는데

@Controller는 위와 같이 다르다

자바는 쓰레드를 많이 생성 할 수 있기 때문에

사용자가 동시에 요청할 경우, 즉 request할 때마다 띄우게 된다

---------------

레거시에서는 

루트컨텍스트/ 서블릿 컨텍스트 가 있어서

메모리에 뜨는 타이밍에 따라 관리한다

-------------

 

@Transactional

알아서 롤백 알아서 커밋됨

 

-------------

퍼시스턴스 - DB와 동기화 되어 있는 데이터 (DB에서 받은 데이터, DB내용과 똑같아야함)

--------------

 

경고메시지

info warn error 등이 있는데

warn error 등을 확인

----------

mysql은 루트로 들어가서 사용자 선택

--------------

 

 

스프링 부트 세팅

Spring Web

SpringBoot Devtool

Lombok

MySQL

MYbatis

---------

JSTL

Tomcat-Embed-Jasper

-----------

테이블생성

------------

1 properties
yml 확장자 변경
DB연결정보넣기
JSP view 경로 설정 (ViewResolver)

2 config 폴더생성
(복붙)
DataSourceConfig.java(참고 : yml 설정을 참고)
DataAccessConfig.java(참고 : DataSource와 Mapper)

3 Mapper 경로에 UserMapper.xml 생성 및 파일 세팅

4 User 클래스 만들기

5 UserRepository 만들기

6 jsp테스트 파일 만들기

7 TestController 생성 및 테스트

 

 

이름과 패키지명을 설정해준다

 

 

필요한 디펜던시를 고른다

 

 

외부에서 필요한 디펜던시들을 가져온다

 

 

 

 

 

 

 

 

외부 디펜던시들을 pom.xml에 넣는다

 

 

application.yml

server:
  port: 8000
  servlet:
    context-path: /blog

spring:  
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
      
  datasource:
    url: jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
    username: spring
    password: bitc5600
    driver-class-name: com.mysql.cj.jdbc.Driver

properties파일을 yml로 바꾸고 세팅해준다

 

 

컨피그 파일을 만든다

 

 

 

 

DataAccessConfig.java

package com.cos.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "com.cos.blog.repository") // 옆의 경로 이하 파일을 메모리에 다띄워준다(@repo~~ 안해줘도됨)
public class DataAccessConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
        		new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

 

 

DataSourceConfig.java

package com.cos.demo.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

	@ConfigurationProperties(prefix="spring.datasource")
	public DataSource dataSource(){
    	return DataSourceBuilder.create().build();
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---------------------

 

서비스 연습

 

 

 

 

 

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

MyBatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면 ��

mybatis.org

xml 파일 세팅 방법

 

 

 

 

 

 

 

 

(매개변수를 DTO로 바꾸자)

 

 

DTO생성

 

 

 

 

 

 

 

 

 

 

 

 

----------------------

 

바텀네비게이션 코드확인

https://github.com/jaybon1/androidwork/tree/master/bottomNavEx01

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

머터리얼 디자인에서 구성하는법 확인

 

https://material.io/develop/android/components/bottom-navigation

 

Material Design

Build beautiful, usable products faster. Material Design is an adaptable system—backed by open-source code—that helps teams build high quality digital experiences.

material.io

 

 

그래들 의존성 추가

    // 나의 라이브러리
    implementation 'com.google.android.material:material:1.1.0-alpha06'

 

 

 

참고

바텀네비게이션 뷰는 5개이상 만들지 말라는 권장사항이 있다

 

 

 

코드분석

 

네비게이션 메뉴 아이콘 생성

 

my_nav_items.xml

res하위 menu에 메뉴아이템들을 설정할 파일을 만든다

위에서 생성한 아이콘을 이용하여 입력

 

 

 

activity_main.xml

아이콘에 글자 안보이게 설정하는 방법

 

 

 

colors.xml

커스텀 컬러를 설정할 수 있다

 

 

 

프래그먼트를 3개 만들어주자

 

 

 

메인액티비티

package com.jaybon.bottomnavex01;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;

import com.google.android.material.bottomnavigation.BottomNavigationView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";


    // 자기가 직접 만든건 앞에 m이나 my를 붙이면 구분이 쉽다
    private BottomNavigationView myBottomNavigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myBottomNavigationView = findViewById(R.id.bottom_nav_view);
        myBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                Log.d(TAG, "onNavigationItemSelected: "+item.getItemId());
                Log.d(TAG, "onNavigationItemSelected: R값: "+R.id.nav_search);
                
                switch (item.getItemId()){

                }
                
                return false;
            }
        });

    }
}

 

 

중간확인

 

package com.jaybon.bottomnavex01;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;

import com.google.android.material.bottomnavigation.BottomNavigationView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";


    // 자기가 직접 만든건 앞에 m이나 my를 붙이면 구분이 쉽다
    private BottomNavigationView myBottomNavigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myBottomNavigationView = findViewById(R.id.bottom_nav_view);
        myBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                Log.d(TAG, "onNavigationItemSelected: "+item.getItemId());
                Log.d(TAG, "onNavigationItemSelected: R값: "+R.id.nav_search);
                
                switch (item.getItemId()){
                    case R.id.nav_search:
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, new Frag1()).commit();
                        break;
                    case R.id.nav_setting:
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, new Frag2()).commit();
                        break;
                    case R.id.nav_nav:
                        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, new Frag3()).commit();
                        break;
                }
                
                return true; // true를 써야 그림이 다시그려진다
            }
        });

    }
}

 

 

 

 

----------------

 

 

 

 

 

 

 

+ Recent posts